问题 为什么Math.nextAfter(Double.MAX_VALUE,1)不等于Double.INFINITY?


根据 Javadoc

public static double nextAfter(double start,
                           double direction)

...

  • 如果start等于±Double.MAX_VALUE并且direction的值使得结果应该具有更大的幅度,则返回与start相同的无穷大。

但根据 这个例子

System.out.println(Double.MAX_VALUE);
System.out.println(Math.nextAfter(Double.MAX_VALUE, 1));
System.out.println(Math.nextAfter(Double.MAX_VALUE, 1) == Double.POSITIVE_INFINITY);

输出:

1.7976931348623157E308
1.7976931348623155E308
false

嗯?不仅不是 Double.POSITIVE_INFINITY,实际上  在数量上。

...157E308
...155E308

我只是完全误读了Javadoc?


4850
2018-06-29 13:29


起源

这里的关键词不是“更大幅度”吗?我的意思是由于精度错误 Double.MAX_VALUE + 1 可能无法准确表示,因此结果是 Double.MAX_VALUE。 - Thomas
显然是进入了 if (transducer > 0L) --transducer; 科 - hammerfest
啊,是的,你是对的。显然,该值被减去,因为消息来源说: if (direction > start) { // Calculate next greater value ... }. else { // Calculate next lesser value。这似乎表明了 direction 是1它小于 MAX_VALUE 因此计算下一个较小的值。 - Thomas
从Javadoc(我强调):“返回与第一个参数相邻的浮点数 方向 第二个论点。“据我所知,这意味着如果 direction 小于 start 计算一个较小的值,因此是唯一有效的方向 MAX_VALUE 增加将是正无穷大。 - Thomas
使用 Math.nextUp 为了达到预期的效果。 - Netch


答案:


这些文档具有误导性。

方向 参数需要 更大 比 Double.MAX_VALUE 为返回值有一个  结果。

由于1较小,因此输出为浮点数 就在此之前 你提供的那个。

C ++文档(在IEEE754下)更清晰,甚至可以明确说明这个边缘情况: http://en.cppreference.com/w/cpp/numeric/math/nextafter


12
2018-06-29 13:40