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