我认为 MIN_NORMAL 是一个可以添加到“正常”双精度的值,并且数字会改变。例如,将 Double.MIN_NORMAL 添加到 0.1d,你会得到一个不同于 0.1d 的值,但是我的理解是错误的:
public static void test(double val) {
if (val == (val - Double.MIN_NORMAL*1e50d))
System.out.printf("val == (val - Double.MIN_NORMAL*1e50d) for val=%.20f\n", val);
else
System.out.printf("val != (val - Double.MIN_NORMAL*1e50d) for val=%.20f\n", val);
}
产生:
test(0.0d);
> val != (val - Double.MIN_NORMAL*1e50d) for val=0.00000000000000000000
test(1.0d);
> val == (val - Double.MIN_NORMAL*1e50d) for val=1.00000000000000000000
test(0.1d);
> val == (val - Double.MIN_NORMAL*1e50d) for val=0.10000000000000000000
有人请在这里解释什么违背了我的逻辑,即使我将 MIN_NORMAL 乘以 1e50d,我仍然得到相同的数字。
我检查了二进制表示,并且 1 * Double.MIN_NORMAL 与 2 * Double.MIN_NORMAL 不同,但是从除零之外的任何内容中减去它们不会改变原始数字。