Java двойное значение соответствует NaN - PullRequest
0 голосов
/ 04 ноября 2019

У меня вопрос, есть ли в Java значение, эквивалентное Double.NaN. Общеизвестно, что Double.NaN эквивалентно Double.longBitsToDouble(0x7ff8000000000000L). Я попробовал это в C ++:

long d = (long)0x7ff8000000000000L;
cout << setprecision(308) << *((double*)&d) << endl;

и получил это число: 1.7913854515396173439813246875759771148370355414969747463437939834712133067539348971091007957318376384187247712070435161526222960236442304023361887799416099781498803833913104211684781256626064276104912473088500848240020138295465213393610297503047186864315005421110542290050185011298999959710557864144337912608e-307. Но я попробовал это на Java, и это не сработало. Есть ли двойной эквивалент Double.NaN в Java?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

В Java у нас есть константа Double.NaN, которая согласно документации такая же, как Double.longBitsToDouble(0x7ff8000000000000L). Почему вы ожидаете, что оно будет равно представлению C ++ NaN?

Ваше преобразование в C ++ кажется неверным, а также в соответствии с документами Double.longBitsToDouble могут быть различия ввозвращаются битовые комбинации, даже если они соответствуют стандарту IEEE 754Не зависите от таких низкоуровневых деталей реализации вашего кода.

0 голосов
/ 05 ноября 2019

NaN не является числом, поэтому вы не должны пытаться выполнить арифметику с ним, например, сравнивая его с другим числом.

...