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

2019-07-02 18:42发布

我有与一个小问题, Math.cos()方法。 我知道,我一直在使用之前,将角弧度转换Math.cos() 但是,如果我只是做:

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

它输出:6.123233995736766E-17

Math.sin()运作良好。

Answer 1:

从三角:

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%左右。 所以,这是一个相当不错的结果...



Answer 2:

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



Answer 3:

该值非常接近正确的结果。 好像精度在转变为弧度的浮点运算的损失。



Answer 4:

在肥皂盒暂时站着,我认为人们感到困惑的概念精度与精度 。 这是一个问题,因为有些人说的吗? 这是个问题吗? 一个错误? 或者是浮点运算的预期的行为?

90度是一个数字,是表示的完全为一个整数,即使双。 但PI / 2弧度是不完全表示,这样的表示会稍微不准确的实数。 损失是精度。 事实是,这是预期的行为。 我们应该永远相信一个结果的最低显著位。

接下来,当我们计算三角函数的值,有可能是准确的额外损失。 我们没有得到完全,我们知道在一个象征性的意义上是真实的结果。 因此罪(PI / 3)可能不完全的sqrt(3)/ 2,但我们不能代表的sqrt(3)/ 2恰好反正。 所有这一切的预期,并且是行为应该由优秀的代码来处理,不信任这些数字的LSB。



文章来源: Java Math.cos(Math.toRadians()) returns weird values