Открыть сервис

Различия версий стандарта 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-1985IEEE 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 →