C# 为什么是Math.Atan(Math.Tan(x))!=x?
如果tan(x)=y,而atan(y)=x,为什么是Math.atan(Math.tan(x))!=x 我试着计算x,比如:C# 为什么是Math.Atan(Math.Tan(x))!=x?,c#,math,C#,Math,如果tan(x)=y,而atan(y)=x,为什么是Math.atan(Math.tan(x))!=x 我试着计算x,比如: tan(2/x +3) = 5 所以 等等。。。但我试过这个: double d = Math.Atan(Math.Tan(10)); 还有d!=10为什么?我不知道什么是C,但数学上说谭是不可逆的,只是在一小段时间内 e、 g.tan(pi)=0,tan(0)=0。当要求atan(0)时,它可以是0或pi(或pi的每一个倍数),因此结果在-pi/2的范围内。。pi
tan(2/x +3) = 5
所以
等等。。。但我试过这个:
double d = Math.Atan(Math.Tan(10));
还有d!=10为什么?我不知道什么是C,但数学上说谭是不可逆的,只是在一小段时间内
e、 g.tan(pi)=0,tan(0)=0。当要求atan(0)时,它可以是0或pi(或pi的每一个倍数),因此结果在-pi/2的范围内。。pi/2
即使你从一个在可逆范围内的x开始,我也不必工作,因为浮点的舍入误差(它没有未指定的精度)
math.tan(math.atan(x)) == x
事实上,每个x都适用(数值误差除外)abs(number1-number2)abs(number1 - number2) < epsilon // ==
abs(number1 - number2) >= epsilon // !=
abs(number1-number2)>=epsilon/=
相反,其中ε是一个小的正常数一般来说,当处理浮点数时,就是在处理近似值。有些数字无法精确表示,tan和arctan运算本身只是近似值 如果要比较浮点数,需要询问它们是否接近相等,或者是否相等,差值是否小于某个较小的值,并仔细考虑您在做什么
这里是一些常见问题(对于C++,但想法是相同的),它谈论了一些浮点数的奇怪之处:
编辑:看看其他答案,我意识到主要的问题可能是tan不是可逆的,但是当你测试浮点数是否相等时,近似问题也值得考虑
查看的.net文档,atan生成的值介于-π/2和之间≤ π/2,不包括10。我认为这是arctan的通常范围。如果您发布了您试图完成的内容,可能会有所帮助。我记得发现了处理问题的三角函数,例如,当我尝试玩角度游戏时,如果输入是在哪个象限,例如tan-1(tan(x))==x表示所有x英寸(-PI/2,PI/2)。图表可能有助于解释为什么没有得到预期的结果
(来源:) 这显示了Tan的图形,但如果你想象读取给定y的x值(例如y=0),那么根据你读取的Tan的“链”,你将得到不同的答案(-pi,0,pi…)。这就是Arctan(x)具有多个解的意义所在 如果arctan仅限于这些链中的一条,例如-pi/2
编辑:但是,根据,如果输入未定义,atan方法已经返回-pi/2
Math.Atan(Math.Tan(-0.49999632679501449))+0.49999632679501449
将大于Double.Epsilon
的1.1235582092889474E+307
倍请注意:在C#Math.Abs(n1-n2)
abs(number1 - number2) < epsilon // ==
abs(number1 - number2) >= epsilon // !=
double normalizedAngle = (angle + Math.PI / 2) % Math.PI - Math.PI / 2;