为什么Math#nextUp不能增加Double.MIN_VALUE?

时间:2019-02-14 21:27:03

标签: java math floating-point

我从Java documentation

中学到了这一点

它基本上说:

  

沿正无穷大方向返回与d相邻的浮点值。

尤其是:

  

如果参数为零,则结果为Double.MIN_VALUE

按照这种逻辑:

Math.nextUp(double x) - x应该始终为Double.MIN_VALUE

所以我进行了测试:

double d_up = Math.nextUp(0);
System.out.println(d_up);                        // 1.401298464324817E-45
System.out.println(d_up == Double.MIN_VALUE);    // false
System.out.println(Double.MIN_VALUE);            // 4.9E-324

它甚至不能为零。

为什么Math.nextUp(double x)不等于x + Double.MIN_VALUE

2 个答案:

答案 0 :(得分:4)

尝试一下:

double d_up = Math.nextUp(0d); // see the little `d` there :)

或者,它也可以正常工作:

double d_up = Math.nextUp(0.0); // `0.0` is a `double` literal

您需要通过 double 才能使所宣传的合同生效。现在您的测试成功了!

4.9E-324
true
4.9E-324

请注意,您之前传递了一个float,所以这是执行的方法:

public static float nextUp​(float f)

...并且自然地,当将Float.MIN_VALUE(一个0)作为参数传递时,该返回值会返回int,因为它会自动转换为float。底线:注意您的类型,请确保将其强制转换为正确的类型。

关于您问题的最后一部分,没有理由使此等式起作用:Math.nextUp(x) - x == Double.MIN_VALUEdouble个数字不是均匀分布的,任何两个数字之间的“距离”不一定是Double.MIN_VALUE

这与以下事实有关:计算机中的十进制值无法精确表示,这都是近似值,具体取决于用于表示它们的位数,这是有限的数量-在任何两个实数之间都有一个无限数量的实数。

答案 1 :(得分:2)

浮点数与此类似:0、1、2、3、4、5、6、7、8、9、10、20、30、40、50、60、70、80、90 ,100、200、300、400、500 ...

“相邻”表示此列表中两个数字彼此相邻。对于此列表中的数字,Math.nextup(x) - x可能会产生1、10或100,具体取决于列表x的位置。