我对Math.cos()
方法有点问题。我知道,在使用Math.cos()
之前,我必须将角度转换为Radians。但如果我这样做:
System.out.println(Math.cos(Math.toRadians(90));
输出:6.123233995736766E-17
Math.sin()
运作良好。
答案 0 :(得分:8)
从三角学:
sin x ~= x, for small values of x
sin x = cos x+pi/2
因为pi / 2不能精确地表示在IEEE-754浮点中,所以它意味着它必须偏离某个值x,即它由pi / 2 + -x表示,其中x <1。浮点系统中最低有效位。在这种情况下,这是2 ^ -53 = 1.1102e-16。
在这种特殊情况下,x~ = 6.123233995736766E-17,约为最大误差的55%。 所以,这是一个相当不错的结果......
答案 1 :(得分:3)
请参阅Javadoc。 “从度数到弧度的转换通常是不精确的。”
答案 2 :(得分:2)
该值非常接近正确的结果。在将度数转换为弧度的浮点运算中似乎失去了精度。
答案 3 :(得分:2)
临时站在肥皂盒上,我认为人们对accuracy versus precision的概念感到困惑。这是一个有问题的问题吗?这是个问题吗?一个bug?或者它是浮点运算的预期行为?
90度是一个可以完美表示为整数的数字,即使是双数。但pi / 2弧度是一个未准确表示的实数,因此表示将略微不准确。损失是准确的。事实是,这是预期的行为。我们永远不应该相信结果中最不重要的部分。
接下来,当我们计算三角函数的值时,可能会有额外的精度损失。在符号意义上,我们并没有得到我们所知道的真实结果。因此sin(pi / 3)可能不完全是sqrt(3)/ 2,但是我们无论如何都不能完全代表sqrt(3)/ 2。所有这一切都是预期的,并且是应该由良好代码处理的行为,而不是信任这些数字的LSB。