问题描述
我从中学到了这一点
它基本上说:
返回在正无穷大方向上与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
?
1楼
尝试这个:
double d_up = Math.nextUp(0d); // see the little `d` there :)
或这样,它也可以正常工作:
double d_up = Math.nextUp(0.0); // `0.0` is a `double` literal
您需要通过两次才能使广告合同生效。 现在您的测试成功了!
4.9E-324
true
4.9E-324
为了清楚起见,您之前传递了一个float
,因此这是执行的方法:
public static float nextUp?(float f)
...并且自然地,当将0
(一个int
)作为参数传递时,它会返回Float.MIN_VALUE
,因为它会自动转换为float
。
底线:请注意您的类型,请确保将其强制转换为正确的类型。
关于问题的最后一部分,没有理由使该方程式起作用: Math.nextUp(x) - x == Double.MIN_VALUE
。
double
精度数字不是均匀隔开的,任何两个数字之间的“距离”不一定是Double.MIN_VALUE
。
这与以下事实有关:计算机中的十进制值无法准确表示,这全都是近似值,具体取决于表示它们的位数,这是一个有限的数量-在任意两个实数之间,存在无限个真实。
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
可能会产生Math.nextup(x) - x
或100,具体取决于列表中x
位置。