Реализация JDK ВС выглядит следующим образом:Как работает Double.isNaN()?
return v != v;
Может кто-нибудь объяснить, как это работает?
Реализация JDK ВС выглядит следующим образом:Как работает Double.isNaN()?
return v != v;
Может кто-нибудь объяснить, как это работает?
Значения NaN не равны ни одному (если одна сторона равенства равна NaN, то равенство равно false), поэтому NaN! = NaN. Очевидно, каждый нормальный двойник действительно равен
Нан - это единственный двойной, который не равен самому себе. Таким образом, проверка v! = V приведет только к True для NaN.
Вот что Java spec должен сказать:
операторы с плавающей точкой не производят исключения (§11). Операция, которая производит переполнения подписанной бесконечности, операции, которая производит недостаточную денормализованного значения или ноль, подписанный и операция, которая не имеет математически определенный результата производит NaN. Все числовые операции с NaN в качестве операнда производят NaN как . Как уже описан, NaN является неупорядоченным, поэтому операция сравнения чисел с участием один или два пренебрежимо малым возвращает ложь и любой ! = Сравнение с участием NaN возвращает правда, в том числе х! = Х, когда х NaN.