如果tan(x)= y且atan(y)= x为什么Math.Atan(Math.Tan(x))!= x?
我试图计算x之类的东西:
tan(2/x +3) = 5
Run Code Online (Sandbox Code Playgroud)
所以
atan(tan(2/x + 3) = atan(5)
Run Code Online (Sandbox Code Playgroud)
等等...但我试过这个:
double d = Math.Atan(Math.Tan(10));
Run Code Online (Sandbox Code Playgroud)
和d!= 10.为什么?
Fed*_*oni 36
math.tan(math.atan(x)) == x
Run Code Online (Sandbox Code Playgroud)
确实适用于每个x(数值误差除外).abs(number1 - number2) < epsilon // ==
abs(number1 - number2) >= epsilon // !=
Run Code Online (Sandbox Code Playgroud) 相反,epsilon是一个小的正常数.图表可能有助于解释您未获得预期结果的原因.
(来源:wolfram.com)
http://mathworld.wolfram.com/Tangent.html
这显示了Tan的图形,但是如果你想象为给定的y读取x的值(例如y = 0),那么根据你读的Tan的"strand",你会得到一个不同的答案(-pi, 0,pi ...).这就是Arctan(x)有多个解决方案的观点.
如果arctan仅限于其中一条链,例如-pi/2 <x <pi/2,则Arctan(tan(x))将返回x,前提是您已考虑浮点误差.
编辑:但是,根据http://msdn.microsoft.com/en-us/library/system.math.atan.aspx,如果输入atan方法已经返回-pi/2 <x <pi/2或NaN未定义.因此,问题必须由浮点数舍入到浮点数.
编辑(FR):增加数字
我不知道任何C#,但是数学表明tan不是可逆的,只是在一个小的intervall中.
例如,tan(pi)= 0并且tan(0)= 0.当要求atan(0)时,它可以是0或pi(或pi的每个倍数),因此结果在-pi/2的范围内. Pi/2相.
即使你从可逆范围内的x开始,我也不必工作,因为浮点的舍入误差(它没有无限制的精度).