Значение 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 класс имеет похожий метод.

Другие вопросы по тегам