Значение Float и Double NaN (Not-a-Number)
Я читал JLS8 4.2.3
там я нашел концепцию Float NaN
а также Double NaN
, Когда я открыл исходный код Float
а также Double
класс, и попробовал следующий код:
1st condition:
if (Float.NaN == Float.intBitsToFloat(0x7fc00000))
System.out.println("Both are equal");
}
2nd condition:
if (Float.NaN == (0.0f / 0.0)) {
System.out.println("Equal");
}
Согласно документации: NaN является
/**
* A constant holding a Not-a-Number (NaN) value of type
* {@code float}. It is equivalent to the value returned by
* {@code Float.intBitsToFloat(0x7fc00000)}.
*/
Тогда почему мои оба условия false
, И в затмении 2nd condition
Я получал warning: Dead Code
,
То же самое с Double NaN
,
3 ответа
Потому что с плавающей точкой определяет NaN == NaN
быть false
, (Это имеет смысл; 0/0
а также acos(2)
оба NaN
, но это не значит, что они равны друг другу в каком-либо полезном смысле.)
использование Float.isNaN()
определить, является ли что-то NaN
,
Это потому, что NaN по определению не равен чему-либо. Он используется для моделирования чего-то, и все, что мы знаем об этом чем-то, это то, что это не число.
Подумайте об этом так: стул - это NaN, ваш экран - также NaN (не число), но ваш стул не совпадает с вашим экраном.
Точно так же, учитывая, что Джейн не твоя мать, а Джон не твоя мать, нет смысла настаивать на том, что Джейн и Джон должны быть одним и тем же человеком.
В дополнение к другим ответам вы можете проверить, float
NaN использует одно из:
Float.isNaN(myFloat);
или же:
Float.compare(Float.NaN, myFloat) == 0
То же самое верно для Double.NaN
; и Double
класс имеет похожий метод.