Почему Math.nextAfter(Double.MAX_VALUE, 1) не равен Double.INFINITY?

Согласно Javadoc:

public static double nextAfter(double start,
                           double direction)

...

  • Если начало равно ± Double.MAX_VALUE, а направление имеет такое значение, что результат должен иметь большую величину, возвращается бесконечность с тем же знаком, что и начало.

Но согласно этот пример:

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

Документы вводят в заблуждение.

Параметр направления должен быть больше Double.MAX_VALUE, чтобы возвращаемое значение получило больший результат.

Поскольку 1 меньше, вывод - это число с плавающей запятой непосредственно перед тем, которое вы предоставляете.

Документы С++ (в соответствии с IEEE754) более ясны и даже явно раскрывают этот регистр: http://en.cppreference.com/w/cpp/numeric/math/nextafter