当前位置:  开发笔记 > 编程语言 > 正文

为什么Math.Atan(Math.Tan(x))!= x?

如何解决《为什么Math.Atan(Math.Tan(x))!=x?》经验,为你挑选了3个好方法。

如果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.为什么?



1> Federico A. ..:

    切线函数是周期性的周期pi,并且只有在将其限制为其域内的子集时才是可逆的.通常这种集合的选择是开放区间] -pi/2,pi/2 [,因此arctan函数将始终返回该区间中的一个点.在你的情况下,10 = 3*pi + 0.57522 ...因此,10的正切的arctan将返回0.57522 ......

    注意,如上定义的arctan函数是单射的,并且在所有实数上定义,因此与您的问题相反

    math.tan(math.atan(x)) == x 
    确实适用于每个x(数值误差除外).

    为了处理数值错误,您不应该使用==或!=在浮点计算的结果之间进行比较.使用

    abs(number1 - number2) <  epsilon   // ==
    abs(number1 - number2) >= epsilon   // !=
    
    相反,epsilon是一个小的正常数.


是的,epsilon的选择是特定于应用程序的.框架不能有一些适用于所有地方的epsilon.
请注意,Double.Epsilon常量表示大于零的最小正Double值.它不适用于任何其他域.
Peter Ritchie/Thomas Lee:此值未定义为最小正数x,因此x + 1.0不等于1.0,因此Double.Epsilon不能用于"几乎相等".在框架中没有常量,其值是最小正数x,使得x + 1.0不等于1.0

2> Tarski..:

图表可能有助于解释您未获得预期结果的原因.

替代文字
(来源:wolfram.com)

http://mathworld.wolfram.com/Tangent.html

这显示了Tan的图形,但是如果你想象为给定的y读取x的值(例如y = 0),那么根据你读的Tan的"strand",你会得到一个不同的答案(-pi, 0,pi ...).这就是Arctan(x)有多个解决方案的观点.

如果arctan仅限于其中一条链,例如-pi/2

编辑:但是,根据http://msdn.microsoft.com/en-us/library/system.math.atan.aspx,如果输入atan方法已经返回-pi/2

编辑(FR):增加数字



3> flolo..:

我不知道任何C#,但是数学表明tan不是可逆的,只是在一个小的intervall中.

例如,tan(pi)= 0并且tan(0)= 0.当要求atan(0)时,它可以是0或pi(或pi的每个倍数),因此结果在-pi/2的范围内. Pi/2相.

即使你从可逆范围内的x开始,我也不必工作,因为浮点的舍入误差(它没有无限制的精度).

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有