Стандарт IEEE 754
Стандарт IEEE 754 (IEEE Standard for Floating-Point Arithmetic) — это технический стандарт, определяющий форматы представления чисел с плавающей запятой, операции над ними, обработку исключительных ситуаций (переполнение, деление на ноль, нечисловые значения) и режимы округления. Разработан Институтом инженеров электротехники и электроники (IEEE). Является основой для вычислений с плавающей запятой в подавляющем большинстве современных компьютерных систем, от микроконтроллеров до суперкомпьютеров.
История
Предпосылки создания
До появления стандарта каждый производитель компьютеров (IBM, DEC, Cray, Intel и другие) использовал собственные форматы представления вещественных чисел. Это приводило к несовместимости данных, различиям в точности вычислений и сложностям при переносе программного обеспечения между разными архитектурами. К концу 1970-х годов стало очевидно, что необходима унификация.
Разработка и принятие
Работа над стандартом началась в 1977 году под руководством Уильяма Кахана (William Kahan), который впоследствии получил за свой вклад в численные методы и стандартизацию вычислений премию Тьюринга. В 1985 году был принят первый вариант стандарта — IEEE 754-1985. Он определил основные форматы: одинарной (32 бита) и двойной (64 бита) точности, а также базовые правила округления и обработки исключений.
Последующие версии
- IEEE 754-2008 — существенно переработанная версия. Включила формат половинной точности (16 бит), четверной точности (128 бит) и десятичные форматы (32, 64 и 128 бит). Уточнены правила сравнения, операции с корнями и тригонометрические функции. Введена концепция «полезных» (subnormal) чисел.
- IEEE 754-2019 — текущая редакция. Внесены незначительные уточнения, в частности, касающиеся операций с десятичными форматами и обработки сигналов NaN.
Основные форматы
Стандарт определяет несколько двоичных форматов, отличающихся разрядностью и диапазоном представимых чисел. Все они имеют общую структуру: знак (1 бит), экспонента (смещённая) и мантисса (дробная часть).
| Формат | Обозначение | Разрядность (бит) | Биты экспоненты | Биты мантиссы | Приблизительный диапазон |
|---|---|---|---|---|---|
| Половинная точность | binary16 | 16 | 5 | 10 | ±6,1×10⁻⁵ … ±6,5×10⁴ |
| Одинарная точность | binary32 (float) | 32 | 8 | 23 | ±1,2×10⁻³⁸ … ±3,4×10³⁸ |
| Двойная точность | binary64 (double) | 64 | 11 | 52 | ±2,2×10⁻³⁰⁸ … ±1,8×10³⁰⁸ |
| Четверная точность | binary128 | 128 | 15 | 112 | ±3,4×10⁻⁴⁹³² … ±1,2×10⁴⁹³² |
Десятичные форматы
Стандарт также включает форматы с десятичным основанием (decimal32, decimal64, decimal128), предназначенные для финансовых и коммерческих расчётов, где требуется точное представление десятичных дробей (например, 0,1). В этих форматах число хранится в виде кодированной десятичной цифры, что исключает ошибки округления, свойственные двоичным форматам.
Структура числа с плавающей запятой
Число в двоичном формате IEEE 754 представляется как:
\[ \text{число} = (-1)^{\text{sign}} \times (1 + \text{fraction}) \times 2^{\text{exponent} - \text{bias}} \]
где:
- sign (бит знака) — 0 для положительных чисел, 1 для отрицательных.
- exponent (экспонента) — целое число без знака, хранящееся со смещением (bias). Для binary32 bias = 127, для binary64 bias = 1023.
- fraction (мантисса) — дробная часть, хранящаяся в нормализованном виде (подразумевается ведущая единица, кроме случая субнормальных чисел).
Особые значения
Стандарт резервирует некоторые комбинации битов экспоненты и мантиссы для представления специальных величин:
- Ноль — два нуля: +0 и -0 (различаются только битом знака). Сравнение +0 и -0 даёт «равно».
- Бесконечность — +∞ и -∞. Возникает при переполнении (результат превышает максимальное представимое число) или делении ненулевого числа на ноль.
- NaN (Not a Number) — нечисловые значения. Используются для обозначения результатов неопределённых операций (например, 0/0, ∞ - ∞, sqrt(-1)). Различают тихие (quiet NaN) и сигнальные (signaling NaN). Тихие NaN распространяются через вычисления, не вызывая исключения; сигнальные — инициируют исключение при попытке использования.
- Субнормальные числа (subnormal, ранее denormalized) — числа, меньшие минимального нормализованного. Позволяют реализовать «постепенное исчезновение» (gradual underflow), уменьшая потерю точности при работе с очень малыми величинами.
Операции
Стандарт предписывает точное выполнение следующих операций для всех форматов:
- Арифметические: сложение, вычитание, умножение, деление, вычисление квадратного корня, остаток от деления.
- Сравнения: равно, не равно, меньше, больше, меньше или равно, больше или равно. Сравнение с NaN всегда даёт «ложь» (кроме проверки на неравенство).
- Преобразования: между форматами с плавающей запятой, между целыми числами, между строками (в обоих направлениях).
- Специальные: копирование знака, округление до целого, извлечение компонентов числа.
Режимы округления
IEEE 754 определяет пять режимов округления, которые выбираются программно или устанавливаются по умолчанию:
- Округление к ближайшему чётному (round to nearest, ties to even) — наиболее распространённый режим. Результат округляется до ближайшего представимого числа; если число находится ровно посередине, округляется до чётной мантиссы.
- Округление к ближайшему с округлением от нуля (round to nearest, ties away from zero) — аналогично, но половинные значения округляются в сторону от нуля.
- Округление к нулю (round toward zero) — усечение дробной части.
- Округление к +∞ (round toward +∞) — округление вверх.
- Округление к -∞ (round toward -∞) — округление вниз.
Исключения и обработка ошибок
Стандарт определяет пять типов исключительных ситуаций, каждая из которых может быть обработана программно или аппаратно:
- Недействительная операция (invalid operation) — например, 0/0, ∞ - ∞, sqrt(-1). Результат — NaN.
- Деление на ноль (division by zero) — результат ±∞.
- Переполнение (overflow) — результат слишком велик для представления. В зависимости от режима округления может дать ±∞ или максимальное нормализованное число.
- Исчезновение (underflow) — результат слишком мал для нормализованного представления. Результат — субнормальное число или ноль.
- Неточный результат (inexact) — результат требует округления (возникает практически при любой операции, кроме точных).
Применение
Стандарт IEEE 754 является основой численных расчётов в большинстве областей:
- Научные и инженерные вычисления — математические пакеты (MATLAB, Mathematica, SciPy), симуляции физических процессов, обработка сигналов.
- Финансовые расчёты — десятичные форматы используются в банковском деле, бухгалтерии, страховании для точного представления денежных сумм.
- Графика и мультимедиа — формат половинной точности широко применяется в графических процессорах (GPU) для текстур, буферов глубины, шейдеров.
- Машинное обучение — формат bfloat16 (Brain Floating Point, модификация IEEE 754) и FP16 используются для обучения и инференса нейросетей.
- Встраиваемые системы — микроконтроллеры и DSP с аппаратной поддержкой IEEE 754.
Критика и ограничения
- Неравномерное распределение точности — числа с плавающей запятой плотнее расположены около нуля и реже — на периферии диапазона. Это может приводить к неожиданным ошибкам округления.
- Сложность субнормальных чисел — обработка субнормальных чисел может быть значительно медленнее нормальных (на некоторых архитектурах в десятки раз), что требует оптимизации кода.
- Неоднозначность десятичных форматов — десятичные форматы IEEE 754-2008 не получили широкого распространения в процессорах общего назначения (кроме некоторых мейнфреймов IBM), уступая место специализированным библиотекам.
- Отсутствие поддержки в некоторых языках — не все языки программирования гарантируют строгое соответствие стандарту (например, в JavaScript все числа — double, но некоторые операции могут отличаться).
Источники
- IEEE Standard for Floating-Point Arithmetic. IEEE Std 754-2019 (Revision of IEEE Std 754-2008). — IEEE, 2019.
- Goldberg D. What Every Computer Scientist Should Know About Floating-Point Arithmetic // ACM Computing Surveys. — 1991. — Vol. 23, No. 1. — P. 5–48.
- Kahan W. Why Do We Need a Floating-Point Standard? // IEEE Micro. — 1981. — Vol. 1, No. 2. — P. 54–62.
- Overton M. L. Numerical Computing with IEEE Floating Point Arithmetic. — SIAM, 2001.
- Muller J.-M. et al. Handbook of Floating-Point Arithmetic. — 2nd ed. — Birkhäuser, 2018.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →