我有与一个小问题, Math.cos()
方法。 我知道,我一直在使用之前,将角弧度转换Math.cos()
但是,如果我只是做:
System.out.println(Math.cos(Math.toRadians(90));
它输出:6.123233995736766E-17
Math.sin()
运作良好。
我有与一个小问题, Math.cos()
方法。 我知道,我一直在使用之前,将角弧度转换Math.cos()
但是,如果我只是做:
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。 “从度弧度的转换通常是不精确的。”
该值非常接近正确的结果。 好像精度在转变为弧度的浮点运算的损失。
在肥皂盒暂时站着,我认为人们感到困惑的概念精度与精度 。 这是一个问题,因为有些人说的吗? 这是个问题吗? 一个错误? 或者是浮点运算的预期的行为?
90度是一个数字,是表示的完全为一个整数,即使双。 但PI / 2弧度是不完全表示,这样的表示会稍微不准确的实数。 损失是精度。 事实是,这是预期的行为。 我们应该永远相信一个结果的最低显著位。
接下来,当我们计算三角函数的值,有可能是准确的额外损失。 我们没有得到完全,我们知道在一个象征性的意义上是真实的结果。 因此罪(PI / 3)可能不完全的sqrt(3)/ 2,但我们不能代表的sqrt(3)/ 2恰好反正。 所有这一切的预期,并且是行为应该由优秀的代码来处理,不信任这些数字的LSB。