它基本上说:
沿正无穷大方向返回与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
?
答案 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_VALUE
。 double
个数字不是均匀分布的,任何两个数字之间的“距离”不一定是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
的位置。