我有一种将度数转换为弧度的方法...
public static double ToRadians(double degAngle)
{
return Math.PI * degAngle / 180;
}
...而且效果很好。
但是当我尝试
Math.Cos(ToRadians(90));
,它返回6.12303176911189E-17。为什么会这样?
答案 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在计算机中的表示方式。