当前位置: 代码迷 >> java >> 为什么Math#nextUp不能增加Double.MIN_VALUE?
  详细解决方案

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

热度:67   发布时间:2023-07-31 12:11:02.0

我从中学到了这一点

它基本上说:

返回在正无穷大方向上与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

尝试这个:

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

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

浮点数与此类似: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位置。

  相关解决方案