NaN это не «не число»

При разработке программного обеспечения очень важно быть точным в использовании терминов: корректное использование необходимо для эффективной коммуникации между разработчиками. Очень важно быть на одной волне.

Один из терминов, который очень часто используют неправильно,— это NaN.

Его корни лежат в стандарте IEEE754, он определяет NaN как специальное значение (на самом деле, как мы увидим далее, множество значений), которое используется если результат вычисления не может или не должен быть представлен как конкретное число, или попросту неизвестен. Например: asin(2) или 0/0. Это приводит нас к следующему открытию: NaN — на самом деле значение числового типа! Просто это специальное число, которое представлено по-особенному.

Итак, NaN, согласно стандарту IEEE754, не какое-то значение не числового типа, но в действительности — число. А это значит, что не совсем корректно говорить, что строка "foo" является NaN, ибо на самом деле это не так.

Всё становится ещё более интересным если мы посмотрим, как значение NaN представлено внутри. У чисел с плавающей запятой двойной точности (64 бит), которые используются для представления значений типа Number в JavaScript и некоторых других языках, специальный диапазон значений, у которых экспонента равна значению 0x7FF (11 бит), выделен для представления числа NaN. А это значит, что оставшиеся 53 бита могут принимать произвольные значения (исключая значения с мантиссой равной нулю, ибо эти значения зарезервированы для двух других специальных значений: +Infinity и -Infinity). Итого, для чисел с плавающей запятой двойной точности мы можем сконструировать значение NaN 9007199254740990 (2^53 - 3) разными способами. Это довольно-таки много.

Подводя итог: если вы используете термин NaN как синоним, обозначающий «что угодно, что не является числом» (строка, значение null, объект, и т.д.), пожалуйста, прекратите. А если вы уже знаете что к чему, то расскажите об этом остальным, что бы они могли выражать свои мысли так же точно, как это делаете вы.

Материалы для дальнейшего изучения: