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

时间:2017-06-29 13:29:36

标签: java floating-point

根据the Javadoc

public static double nextAfter(double start,
                           double direction)
     

...

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

但根据this example

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?

1 个答案:

答案 0 :(得分:12)

文档具有误导性。

direction 参数需要更大而不是Double.MAX_VALUE,以使返回的值具有更大的结果。

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

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