Сумма NaN: как рассчитывается базовая битовая комбинация? - PullRequest
3 голосов
/ 26 марта 2020

Вопрос : Как 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?

Спасибо!

1 Ответ

4 голосов
/ 26 марта 2020

Для операций с плавающей запятой большинство реализаций просто полагаются на то, что делает базовое оборудование. Предполагая, что вы выполняете это на какой-то архитектуре x86, вот правила: (Вы можете найти это в Разделе 4.8.3.5 https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf):

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...