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