Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么是Math.Atan(Math.Tan(x))!=x?_C#_Math - Fatal编程技术网

C# 为什么是Math.Atan(Math.Tan(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(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/2

即使你从一个在可逆范围内的x开始,我也不必工作,因为浮点的舍入误差(它没有未指定的精度)

  • 切线函数是周期为π的周期函数,并且只有当您将其限制在其域的一个子集(其上为内射)时,切线函数才是可逆的。通常,此类集合的选择是开放区间]-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)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 编辑(F.R.):添加数字

    双d=Math.Atan(1)*(180/Math.PI); 所以d是45度

  • 因为切线函数是周期性的,所以我们需要规范化输入角度。返回一个角度θ,以弧度为单位,例如-π/2≤ θ ≤ π/2,所以归一化到该范围是有意义的(因为它显然不会在该范围内):

  • 双倍应该比较有一定的误差。但事实上对于这种情况来说是太小和太小了“如果创建一个自定义算法来确定两个浮点数是否相等,则必须使用一个大于ε常量的值来确定两个相等值的可接受绝对差值。”。(通常,该差值比Epsilon大很多倍)“例如,
    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;