Вопрос : Как JVM вычисляет сумму двух NaN с двойной точностью?
Детали: спецификация IEEE 754 резервирует два диапазона битовых комбинаций для NaN:
0x7ff0000000000001 -> 0x7fffffffffffffff
и
0xfff0000000000001 -> 0xffffffffffffffff.
IEEE 754 требует, чтобы сумма двух NaN была NaN, но, насколько я могу судить, молчать о деталях реализации. Итак, чтобы перейти к моему вопросу: если мы напишем b(x)
для шестнадцатеричной битовой комбинации NaN x
, я хотел бы знать: как JVM вычисляет b(x + y)
из b(x)
и b(y)?
Воспроизведение с небольшим количеством кода, я считаю, что:
Заявка : Пусть t = 0x0008000000000000
. Если b(y) + t
находится в допустимом диапазоне NaN, то:
b(x + y) = b(y) + t
в противном случае,
b(x + y) = b(y).
Это кажется мне странным, и я хотел бы узнать больше. Для справки, я использую Java 8 на MacBook Intel i7 (в случае, если версия Java или физическое оборудование имеют значение.) Вот два примера:
Пример 1, где b(x + y) = b(y):
b(x) = 0x7fffddee0f43e7d4
b(y) = 0xfffaeaba08397e4e
b(x + y) = 0xfffaeaba08397e4e
Пример 2, где b(x + y) = b(y) + t:
b(x) = 0xffff4f0202031106
b(y) = 0xfff79342c97104ff
b(x + y) = 0xffff9342c97104ff
Кто-нибудь знает, как сумма оценивается JVM?
Спасибо!