如果tan(x)= y且atan(y)= x为什么Math.Atan(Math.Tan(x))!= x?
我试图计算x之类的东西:
tan(2/x +3) = 5
所以
atan(tan(2/x + 3) = atan(5)
等等......但我试过了:
double d = Math.Atan(Math.Tan(10));
和d!= 10.为什么?
答案 0 :(得分:36)
math.tan(math.atan(x)) == x
确实适用于每个x(数值误差除外)。abs(number1 - number2) < epsilon // ==
abs(number1 - number2) >= epsilon // !=
,其中epsilon是一个小的正常数。答案 1 :(得分:8)
图表可能有助于解释您未获得预期效果的原因。
(来源:wolfram.com)
http://mathworld.wolfram.com/Tangent.html
这显示了Tan的图形,但是如果你想象为给定的y读取x的值(例如y = 0),那么根据你读的Tan的“strand”,你会得到一个不同的答案( -pi,0,pi ...)。这就是Arctan(x)有多个解决方案的观点。
如果arctan仅限于其中一条链,例如-pi / 2&lt; x&lt; pi / 2然后Arctan(tan(x))将返回x,前提是你已经解释了浮点错误。
编辑:但是,根据http://msdn.microsoft.com/en-us/library/system.math.atan.aspx,atan方法已经返回-pi / 2&lt; x&lt;如果您的输入未定义,则为pi / 2或NaN。因此,问题必须由浮点四舍五入。
编辑(F.R.):增加数字
答案 2 :(得分:7)
我不知道任何C#,但是数学表明tan不能反转,只能在一个小的intervall中。
e.g。 tan(pi)= 0且tan(0)= 0.当要求atan(0)时,它可能是0或pi(或pi的每个倍数),因此结果在-pi / 2的范围内.pi / 2。
即使你在可反转范围内以x开始,我也不必工作,因为浮点的舍入误差(它没有无限制的精度)。
答案 3 :(得分:3)
tan -1 (tan(x))== x表示(-PI / 2,PI / 2)中的所有x。
答案 4 :(得分:1)
因为切线函数是周期性的,我们需要规范化输入角度。 Math.Atan返回一个角度,θ,以弧度为单位,这样-π/2≤θ≤π/ 2 ,因此将其归一化是有意义的范围(因为它显然不会在该范围内的任何东西):
double normalizedAngle = (angle + Math.PI / 2) % Math.PI - Math.PI / 2;
双打应与一些误差范围进行比较。但实际上对于这种情况Double.Epsilon
太小了“如果你创建一个自定义算法来确定两个浮点数是否可以被认为是相等的,你必须使用一个大于 Epsilon <的值/ strong>常数,以确定两个值被认为相等的可接受的绝对差值。(通常,差值的差值是 Epsilon 的许多倍。)“例如,{{1对于Math.Atan(Math.Tan(-0.49999632679501449)) + 0.49999632679501449
次,将大于Double.Epsilon
。
答案 5 :(得分:0)
通常,当您处理浮点数时,您正在处理近似值。有些数字无法准确表示,而tan和arctan操作本身只是近似值。
如果你想比较浮点数,你需要问它们是否几乎相等,或等价,如果差值小于某个小值,并仔细考虑你在做什么。
这是一些常见问题解答(对于c ++,但想法是一样的),稍微谈谈一些浮点数的奇怪之处:</ p>
编辑:看看其他答案,我意识到主要问题可能是tan不可逆,但每当你测试浮点数是否相等时,近似问题也值得考虑。
查看Math.Atan的.net文档,atan产生的值介于-π/ 2和≤π/ 2之间,不包括10.我认为是arctan的通常范围。
答案 6 :(得分:0)
如果你发布了你想要完成的任务,那可能会有所帮助。例如,当我尝试使用角度时,如果输入的象限对我来说,我有发现处理问题的触发函数的回忆。
答案 7 :(得分:0)
double d = Math.Atan(1)*(180 / Math.PI); 所以d将是45度