Различия версий стандарта NaN в вычислительной технике¶
NaN (от англ. Not a Number — «не число») — специальное значение в стандарте представления чисел с плавающей запятой IEEE 754, используемое для обозначения результата неопределённых или некорректных арифметических операций. В зависимости от контекста под «NaN 1» и «NaN 2» могут подразумеваться разные сущности: два типа NaN внутри одного стандарта (quiet и signaling), версии стандарта IEEE 754 (1985 и 2008 годов) либо реализации в конкретных языках программирования. Ниже рассматриваются основные трактовки этого сопоставления.
¶Два типа NaN в стандарте IEEE 754
Ключевое различие, которое чаще всего имеется в виду, — деление NaN на два вида по способу обработки сигнала об ошибке.
¶Quiet NaN (qNaN)
Тихий NaN (quiet NaN, qNaN) — значение, которое распространяется через вычисления, не вызывая немедленного прерывания. Если qNaN участвует в операции, результат, как правило, тоже становится qNaN. Это основной тип, с которым работают программы: он позволяет отложить проверку и обработать ошибку в удобный момент.
¶Signaling NaN (sNaN)
Сигнальный NaN (signaling NaN, sNaN) при использовании в операции должен инициировать исключение (флаг недопустимой операции). Он предназначен для отлова ошибок в момент их возникновения. Особенность: при копировании или некоторых операциях sNaN может «успокаиваться» и превращаться в qNaN.
Различие между ними задаётся не значением мантиссы как таковым, а конкретным битом в её старшем разряде: для qNaN старший бит мантиссы равен 1, для sNaN — 0 (при всех единицах в поле экспоненты).
¶Различия между редакциями IEEE 754
Второе распространённое сопоставление — версии стандарта.
| Характеристика | IEEE 754-1985 | IEEE 754-2008/2019 |
|---|---|---|
| Формализация типов NaN | Единое понятие NaN | Явное разделение qNaN и sNaN |
| Десятичные форматы | Не включены | Добавлены decimal32/64/128 |
| Форматы обмена | Базовые | Расширены, включая half precision |
| Операции слияния | Не стандартизированы | Введены fused multiply-add |
Редакция 1985 года описывала NaN в основном как единую категорию, тогда как редакция 2008 года (и её ревизия 2019 года) детально регламентировала поведение qNaN и sNaN, а также расширила набор форматов.
¶Реализации в языках программирования
В практическом программировании «NaN 1» и «NaN 2» могут означать разные значения, порождаемые разными операциями, либо разные константы в библиотеках.
- В Python модуль math и NumPy позволяют получать NaN разными путями:
float('nan'),math.nan, результат0/0илиinf - inf. Все они относятся к qNaN, но могут иметь разные битовые представления. - В JavaScript существует единственное значение
NaN, однако его битовый шаблон не гарантирован спецификацией. - В C/C++ макросы
NANи функции вродеnanf()создают qNaN; sNaN обычно формируется вручную через битовые операции.
С точки зрения сравнения любые NaN не равны сами себе: выражение NaN == NaN даёт ложь. Поэтому «отличить» одно NaN от другого прямым сравнением невозможно — требуется анализ битового представления (например, через memcpy в целочисленный тип или функции вроде isnan, issignaling).
¶Битовое представление
Для 32-битного формата (float) поле экспоненты NaN заполнено единицами (0xFF). Оставшиеся 23 бита мантиссы кодируют полезную нагрузку (payload) и тип:
- qNaN: старший бит мантиссы = 1;
- sNaN: старший бит мантиссы = 0, но хотя бы один другой бит = 1.
Полезная нагрузка позволяет переносить диагностическую информацию, различая «NaN 1» и «NaN 2» по конкретному числовому коду.
¶Практическое значение различий
Разделение типов важно для:
- отладки — sNaN помогает обнаружить ошибку в точке возникновения;
- численных вычислений — qNaN обеспечивает устойчивое распространение результата;
- переносимости кода — разные платформы по-разному обрабатывают sNaN;
- сериализации — при передаче между системами тип NaN может теряться.
¶Итоговое сопоставление
Если под «NaN 1» и «NaN 2» понимаются quiet и signaling NaN, различие состоит в реакции на операцию: qNaN молча распространяется, sNaN генерирует исключение. Если речь о версиях стандарта — различие в степени детализации и наборе поддерживаемых форматов. В любом случае корректное различение требует анализа битового представления, а не операции сравнения.
IRONLIVE — база данных и аналитика по компаниям России.
На главную IRONLIVE →