Нечисло

Материал из Википедии — свободной энциклопедии
(перенаправлено с «NaN»)
Перейти к навигации Перейти к поиску

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

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

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

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

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

Поведение других операций сравнения зависит от языка. Одни языки дают значение «ложь»[4] (так что 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. А. Н. Степанов. Курс информатики. — СПб.: Питер, 2018. — С. 160. — 1088 с.
  2. 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. Архивировано 16 июля 2021 года.
  3. В некоторых языках, таких как Python результат операции будет равен 1, а не NaN.
  4. NUM07-J. Do not attempt comparisons with NaN — CERT Oracle Coding Standard for Java — CERT Secure Coding Standards. Дата обращения: 17 июня 2016. Архивировано 29 июля 2016 года.