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

And*_*ner 11 java floating-point

根据Javadoc:

public static double nextAfter(double start,
                           double direction)
Run Code Online (Sandbox Code Playgroud)

...

  • 如果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);
Run Code Online (Sandbox Code Playgroud)

输出:

1.7976931348623157E308
1.7976931348623155E308
false
Run Code Online (Sandbox Code Playgroud)

嗯?它不仅不是Double.POSITIVE_INFINITY,它的数量实际上更小.

...157E308
...155E308
Run Code Online (Sandbox Code Playgroud)

我只是完全误读了Javadoc吗?

Bat*_*eba 12

这些文档具有误导性.

方向参数需要是更大的Double.MAX_VALUE为返回值具有较大的结果.

由于1较小,因此输出是您提供的浮点数之前的浮点数.

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