为什么.NET Math.Cos()对于pi / 2返回错误的答案?

时间:2020-02-06 18:30:09

标签: c# .net math trigonometry

我有一种将度数转换为弧度的方法...

public static double ToRadians(double degAngle) 
{
    return Math.PI * degAngle / 180;
}

...而且效果很好。 但是当我尝试 Math.Cos(ToRadians(90));,它返回6.12303176911189E-17。为什么会这样?

2 个答案:

答案 0 :(得分:1)

不是因为您没有将pi / 2作为参数传递,而是因为它与之接近。

Math.PI * 90/180将不会返回90度的精确弧度,只是很接近,因为Math.PI没有无限的精度。要获得Math.Cos返回的精确值0,您需要以弧度传递精确值。您只能获得非常接近零的值。 documentation表示这是正确的值。

答案 1 :(得分:1)

90度约为 1.5707963267948966...弧度。我说“大约”是因为PI是一个超越数,但是在双精度浮点值中,我们仅限于64位。这意味着最终的计算将有一定误差。取余弦(先验函数)时,再次发生相同的错误。结果值不能完美地用双精度表示,因此您会得到一个近似值。正确答案是零。您得到的答案是0.00000000000000061230317691118863非常接近零。

如果您要手动进行此数学运算,则使用3.14作为PI的值,由于相同的原因,您将获得接近但不完全为零的答案,原因是:您使用的是近似值。使用3.1415926将为您提供更接近的答案,但是PI的值仍然是一个近似值。该计算机正在使用另一种近似值,该近似值限于64位精度,大约为PI的16位数字。

在使用IEEE-754浮点运算的任何计算系统中都会发生此问题。有关更多信息,请参见Is floating point math broken?

也请看一下this blog post,其中将更详细地介绍PI在计算机中的表示方式。