Я посмотрел на реализацию класса java.lang.Double
. Значение NaN
является указанным значением 0x7ff8000000000000L
. В поле public static final double NaN
установлено значение 0.0d / 0.0
, которое должно оцениваться как 0x7ff8000000000000L
, если JVM реализует его таким образом.
Почему было выбрано это значение (
0x7ff8000000000000L
)? Есть ли что-то особенное в этом значении (например, его битовая маска)?Почему поле неявно установлено на это значение и зависит от базовой реализации операции
0.0d / 0.0
, тогда как статический методpublic static long doubleToLongBits(double value)
явно устанавливает значение0x7ff8000000000000L
для аргументаNaN
? Не было ли намного безопаснее неявно установить его, поскольку результат0.0d / 0.0
сильно зависит от реализации JVM и может быть изменен (скорее всего, никогда не будет) теоретически?
То же самое касается POSITIVE_INFINITY
и NEGATIVE_INFINITY
. Поля неявно устанавливаются на свои значения, но некоторые методы используют явно заданные значения. Есть ли за этим причина?
Спасибо, что помогаете мне узнавать что-то новое каждый день :-).
as the result of 0.0d / 0.0 highly depends on the implementation of the JVM and could be changed
- нет, JLS указывает, что 0.d/0.0 возвращает NaN, поэтому 0.d/0.0 по определению является NaN. - person Eran   schedule 19.03.2019Double.NaN == Double.NaN
равноfalse
. Но все они вернутtrue
заDouble.isNaN
. - person Amadan   schedule 19.03.20190x7ff8000000000000L
является длинным, исключает его использование при указании поля с двойным значением. - person Andy Turner   schedule 19.03.2019