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