Нечисло

(перенаправлено с «NaN»)

Нечисло (NaN от англ. Not-a-Number) — одно из особых состояний числа с плавающей запятой. Используется во многих математических библиотеках и математических сопроцессорах. Данное состояние может возникнуть в различных случаях, например, когда предыдущая математическая операция завершилась с неопределённым результатом или если в ячейку памяти попало не удовлетворяющее условиям число.

В соответствии с IEEE 754, такое состояние задаётся через установку показателя степени в зарезервированное значение 11…11, а мантиссы — во что угодно, кроме 0 (зарезервированное значение для машинной бесконечности). Знак и мантисса могут нести какую-то дополнительную информацию: многие библиотеки «отрицательное» нечисло выводят как -NaN.

К операциям, приводящим к появлению нечисла в качестве результата, относятся:

  • все нетривиальные математические операции, содержащие нечисло в качестве одного из операндов;
  • деление нуля на ноль;
  • деление бесконечности на бесконечность;
  • умножение нуля на бесконечность;
  • сложение бесконечности с бесконечностью противоположного знака;
  • вычисление квадратного корня отрицательного числа[прим. 1];
  • логарифмирование отрицательного числа[прим. 1];
  • при вычислении по стандарту IEEE 754-2008[1][2].

СвойстваПравить

Нечисло не равно ни одному другому значению (даже самому себе). Благодаря этому один из распространённых, однако не очевидных, способов проверки результата на нечисло — это сравнение полученной величины с самой собой. Более прозрачным и явным способом является вызов функции проверки числа на NaN — isnan в большинстве языков программирования.

Поведение других операций сравнения зависит от языка. Одни языки дают значение «ложь»[3] (так что a < b и b > a по-разному ведут себя с NaN), другие — формируют исключительную ситуацию даже для «тихого» нечисла.

Любая нетривиальная операция, принимающая «тихое» нечисло как аргумент, всегда возвращает нечисло вне зависимости от значения других аргументов. Единственными исключениями из этого правила являются функции max() и min(), которые возвращают значение другого аргумента (отличного от нечисла).

Особенности реализацийПравить

В некоторых языках программирования есть «тихое нечисло» (qNaN) и «сигнальное нечисло» (sNaN): первое, попав в любую операцию, возвращает обычное нечисло (NaN), второе — вызывает исключительную ситуацию. Обычно «тихое нечисло» или «сигнальное нечисло» определяются старшим битом мантиссы.

По стандарту IEEE754-1985 1NaNдолжно быть равно NaN, однако большинство математических библиотек возвращало 1. В связи с этим, в стандарте 2008 года результатом этой операции является 1.

Нечисло может по-разному выводится на экран, например:

nan (вывод программ на Си, C++)
NaN (ECMAScript, Rust, C#)
#SNAN, #QNAN или #IND (Excel)
+nan.0 (Scheme)

Целочисленный NaNПравить

Большинство представлений целых чисел не поддерживают указание на то, что число некорректно. В этом случае стандарт IEEE754 предписывает выбрасывать исключение при конвертации нечисла в целое число. Так, в Java такие операции выдают исключение java.lang.ArithmeticException. В Си это приводит к неопредёленному поведению, но также возможен выброс исключения и возврат неопределённого значения, как того требует стандарт.

Пакет Math::BigInt языка Perl использует «NaN» для строк, которые не могут быть преобразованы в числа.

> perl -mMath::BigInt -e "print Math::BigInt->new('foo')"
NaN

ПримечанияПравить

КомментарийПравить

  1. 1 2 В случае, если библиотека, выполняющая эту операцию, не поддерживает либо не настроена на использование комплексных чисел.

ИсточникиПравить

  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.
  2. В некоторых языках, таких как Python результат операции будет равен 1, а не NaN.
  3. NUM07-J. Do not attempt comparisons with NaN — CERT Oracle Coding Standard for Java — CERT Secure Coding Standards. Дата обращения: 17 июня 2016. Архивировано 29 июля 2016 года.

СсылкиПравить