NaN
NaN (англ. Not-a-Number, «не число») — одно из особых состояний числа с плавающей запятой. Используется во многих математических библиотеках и математических сопроцессорах. Данное состояние может возникнуть в различных случаях, например, когда предыдущая математическая операция завершилась с неопределённым результатом или если в ячейку памяти попало не удовлетворяющее условиям число.
В соответствии с IEEE 754, такое состояние задаётся через установку показателя степени в зарезервированное значение 11…11, а мантиссы — во что угодно, кроме 0 (зарезервированное значение для машинной бесконечности). Знак и мантисса могут нести какую-то дополнительную информацию: многие библиотеки «отрицательный» NaN выводят как -NaN
.
К операциям, приводящим к появлению NaN в качестве ответа, относятся:
- все нетривиальные математические операции, содержащие NaN в качестве одного из операндов;
- деление нуля на ноль;
- деление бесконечности на бесконечность;
- умножение нуля на бесконечность;
- сложение бесконечности с бесконечностью противоположного знака;
- вычисление квадратного корня отрицательного числа[прим. 1];
- логарифмирование отрицательного числа[прим. 1];
- при вычислении по стандарту IEEE 754-2008[1].
В некоторых языках программирования есть «тихий» и «сигнальный» NaN: первый, попав в любую операцию, возвращает NaN, второй — вызывает исключительную ситуацию. Обычно «тихий» или «сигнальный» определяется старшим битом мантиссы.
Свойства
- NaN не равен ни одному другому значению (даже самому себе). Благодаря этому один из распространённых, однако не очевидных, способов проверки результата на NaN — это сравнение полученной величины с самой собой. Более прозрачным и явным способом является вызов функции
isNaN()
. - Поведение других операций сравнения зависит от языка. Одни языки дают ложь[2] (так что
a < b
иb > a
по-разному ведут себя с NaN), другие — формируют исключительную ситуацию даже для «тихого» NaN. - Любая нетривиальная операция, принимающая «тихий» NaN как аргумент, всегда возвращает NaN вне зависимости от значения других аргументов. Единственными исключениями из этого правила являются функции
max()
иmin()
, которые возвращают значение другого аргумента (отличного от NaN). - Тривиальные операции, являющиеся тождеством, обрабатываются особо: так, например, 1NaN равно 1.
См. также
Примечания
Примечания
- В случае, если библиотека, выполняющая эту операцию, не поддерживает либо не настроена на использование комплексных чисел.
Источники
- IEEE Computer Society. IEEE Standard for Floating-Point Arithmetic § 9.2.1 (англ.) : journal. — IEEE, 2008. — 29 August. — ISBN 978-0-7381-5753-5. — doi:10.1109/IEEESTD.2008.4610935.
- NUM07-J. Do not attempt comparisons with NaN — CERT Oracle Coding Standard for Java — CERT Secure Coding Standards