java cos(Math.toRadians(< angle>))返回奇怪的值

unhi4e5o  于 2023-05-21  发布在  Java
关注(0)|答案(5)|浏览(119)

我在Math.cos()方法上遇到了一个小问题。我知道,我必须在使用Math.cos()之前将Angular 转换为弧度。但如果我这么做了

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

输出:6.123233995736766E-17
Math.sin()运行良好。

1yjd4xko

1yjd4xko1#

三角函数:

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%。所以,这是一个相当好的结果…

8i9zcol2

8i9zcol22#

查看Javadoc。“从度到弧度的转换通常是不精确的.”

euoag5mw

euoag5mw3#

该值非常接近正确的结果。这看起来像是将度转换为弧度的浮点运算中的精度损失。

pcww981p

pcww981p4#

站在临时的演讲台上,我想人们对accuracy versus precision的概念感到困惑。这是否如一些人所说的那样是一个问题?有问题吗?一个错误?还是浮点运算的一个预期行为?
90度是一个完全可以表示为整数的数字,即使是双精度型。但是π/2弧度是一个不能精确表示的真实的,所以这种表示会稍微不准确。损失在于准确性。事实是,这是预期的行为。我们永远不应该相信结果中最不重要的部分。
接下来,当我们计算三角函数的值时,可能会有额外的精度损失。我们并没有得到确切的结果,我们知道在符号意义上是正确的。因此sin(pi/3)可能不完全是sqrt(3)/2,但无论如何我们都不能完全表示sqrt(3)/2。所有这些都是预期的,并且是应该由良好代码处理的行为,而不是信任这些数字的LSB。

tjvv9vkg

tjvv9vkg5#

由于三角函数的值给出了近似值,因此PI的值是无理的。对于计算器中的精确值,请使用以下命令:
public class MyClass { public static void main(String strategy []){

double b1=Math.cos(Math.toRadians(90));
  //approximate value 
  System.out.println(b1);
  //exact value   System.out.println(String.format("%.15f",b1));
  // I recommend you to using it upto 15f for precisely value
  double b2=Math.sin(Math.toRadians(30));
  //approximate value 
  System.out.println(b2);
  //exact value
  System.out.println(String.format("%.15f",b2));
}

}

相关问题