Java Math.cos(Math.toRadians())返回奇怪的值

我对Math.cos()方法有一点问题。 我知道,在使用Math.cos()之前,我必须将角度转换为Radians。 但如果我这样做:

 System.out.println(Math.cos(Math.toRadians(90)); 

输出:6.123233995736766E-17

Math.sin()运行良好。

从三角学:

 sin x ~= x, for small values of x sin x = cos x+pi/2 

因为pi / 2不能在IEEE-754浮点中精确表示,这意味着它必须偏离某个值x,即它由pi / 2 + – x表示,其中x <最低有效位浮点系统。 在这种情况下,2 ^ -53 = 1.1102e-16。

在这种特殊情况下,x~ = 6.123233995736766E-17,约为最大误差的55%。 所以,这是一个相当不错的结果……

见Javadoc。 “从度数到弧度的转换通常是不精确的。”

该值非常接近正确的结果。 在将度数转换为弧度的浮点运算中似乎失去了精度。

暂时站在肥皂盒上,我认为人们对准确性与精确度的概念感到困惑。 这是一个有问题的问题吗? 这是个问题吗? 一个bug? 或者它是浮点运算的预期行为?

90度是一个完整可以表示为整数的数字,即使是双数。 但是pi / 2弧度是一个未准确表示的实数,因此表示将略微不准确。 损失是准确的。 事实是,这是预期的行为。 我们永远不应该相信结果中最不重要的部分。

接下来,当我们计算三角函数的值时,可能会有额外的精度损失。 我们没有得到完全符合意义的结果。 因此sin(pi / 3)可能不完全是sqrt(3)/ 2,但是我们无论如何都不能完全代表sqrt(3)/ 2。 所有这些都是预期的,并且是应该由良好代码处理的行为,而不是信任这些数字的LSB。

Interesting Posts