Java Math.cos()方法在预期时不返回0

dim*_*414 9 java trigonometry

在Windows 7 PC上使用Java(不确定是否重要)并且在应该返回0的值(如pi/2)上调用Math.cos()会返回小值,但除非我误解,否则返回的值很小从零开始大于1 ulp.

Math.cos(Math.PI/2) = 6.123233995736766E-17
Math.ulp(Math.cos(Math.PI/2)) = 1.232595164407831E-32
Run Code Online (Sandbox Code Playgroud)

这实际上是在1 ulp内,我只是困惑吗?这是否是一个可以接受的解决这个小错误的包装方法?

public static double cos(double a){
    double temp = Math.abs(a % Math.PI);
    if(temp == Math.PI/2)
        return 0;
    return Math.cos(a);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 11

不要忘记这Math.PI/2是一个近似值.它不会完全是 pi/2,因此结果cos(Math.PI/2)不会完全为0. Math.cos可能会返回计算返回的精确值的余弦的非常精确的版本Math.PI/2.


Sla*_*ast 7

你永远不应该使用==双打.您必须始终在误差范围内.如果你问我,10 -17是很好的精度.10 -32的 Ulp图只是10 -17数量级的双倍的预先计算,因为2.220446049250313E-16是10 0幅度的数字的精度.