MIN_NORMAL は、「通常の」double に追加できる値であり、数値が変化すると思いました。たとえば、 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 とは異なりますが、ゼロ以外のものからそれらを減算しても元の数値は変わりません。