给出这两个double值
double d1 = 1.0E-24;
double d2 = 1.0000000000000029E-24;
以及以下功能
public static boolean isEqual(double d0, double d1, double epsilon) {
return d0 == d1 ? true : Math.abs(d0 - d1) < epsilon;
}
如何计算最小的epsilon(最小的两倍距离),以便项Math.abs(d0 - d1) < epsilon
的计算结果为true?
已针对评论进行了编辑:
我知道方法Double.doubleToRawLongBits
,但仍需要澄清一些我需要比较的位。
因此,两个双精度值的二进制表示形式都是
d1: 0 11101011110 0011010101111100001010011001101010001000111010100111
d2: 0 11101011110 0011010101111100001010011001101010001000111010110111
我是否只需要比较像这样的尾数位?
isEqual(getMantissaLongBits(d1), getMantissaLongBits(d2), epsilon(getMantissaLongBits(d1), getMantissaLongBits(d2),49))?
private static long getMantissaLongBits(double x) {
return Double.doubleToRawLongBits(x) & 0x000fffffffffffffL;
}
public static double epsilon(final double one, final double other, final int bits) {
return Math.max(Math.scalb(Math.max(Math.abs(one), Math.abs(other)), -bits),
Math.scalb(Double.MIN_NORMAL, 52 - bits));
}