IEEE 754
IEEE 754 — это стандарт двоичной арифметики с плавающей запятой, разработанный Институтом инженеров электротехники и электроники (IEEE). Он определяет форматы представления чисел, правила выполнения арифметических операций, обработку исключительных ситуаций (таких как деление на ноль или переполнение) и способы округления. Стандарт является основой для вычислений с плавающей запятой в большинстве современных процессоров, языков программирования и математических библиотек.
История
Первая версия стандарта, IEEE 754-1985, была опубликована в 1985 году. Она возникла как ответ на разрозненность форматов и алгоритмов, используемых разными производителями вычислительной техники (Intel, Motorola, IBM и др.). Целью было обеспечение переносимости численных алгоритмов между разными платформами. Основой для стандарта послужила работа Уильяма Кахана, который внёс ключевой вклад в теорию округления и обработки исключений.
В 2008 году была принята вторая редакция — IEEE 754-2008, которая значительно расширила стандарт. Основные изменения:
- Введены 16-битные (binary16) и 128-битные (binary128) форматы.
- Добавлены форматы с десятичным основанием (decimal64, decimal128), предназначенные для финансовых вычислений, где важна точность представления десятичных дробей.
- Уточнены правила для операций слияния умножения-сложения (FMA).
- Введено понятие «минимальных» и «расширенных» форматов для встраиваемых систем.
Текущая версия — IEEE 754-2019, которая в основном уточняет предыдущую редакцию, добавляя рекомендации по работе с новыми типами данных и методами округления.
Основные форматы
Стандарт определяет несколько базовых форматов двоичной арифметики. Каждый формат характеризуется тремя параметрами: количеством бит для знака (S), экспоненты (E) и мантиссы (M).
Форматы binary (двоичные)
| Название | Общее число бит | Биты знака | Биты экспоненты | Биты мантиссы | Диапазон (приблизительно) | Точность (десятичных цифр) |
|---|---|---|---|---|---|---|
| binary16 (половинная точность) | 16 | 1 | 5 | 10 | ±6.5×10⁻⁵ … ±6.5×10⁴ | ~3.3 |
| binary32 (одинарная точность, float) | 32 | 1 | 8 | 23 | ±1.2×10⁻³⁸ … ±3.4×10³⁸ | ~7.2 |
| binary64 (двойная точность, double) | 64 | 1 | 11 | 52 | ±2.2×10⁻³⁰⁸ … ±1.8×10³⁰⁸ | ~15.9 |
| binary128 (четверная точность) | 128 | 1 | 15 | 112 | ±3.4×10⁻⁴⁹³² … ±1.2×10⁴⁹³² | ~34.0 |
Форматы binary32 и binary64 являются наиболее распространёнными. В большинстве современных языков программирования (C, C++, Java, Python) тип float соответствует binary32, а double — binary64.
Форматы decimal (десятичные)
Эти форматы предназначены для точного представления десятичных дробей (например, 0.1). Они основаны на кодировании цифр в двоично-десятичном коде (BCD) или с использованием специальных схем сжатия. Основные форматы: decimal32, decimal64, decimal128.
Представление чисел
Число с плавающей запятой в формате binary кодируется как:
(-1)ˢ × (1 + M) × 2^(E - bias)
где:
- s — бит знака (0 для положительных, 1 для отрицательных).
- M — дробная часть мантиссы (нормализованное значение от 0 до 1).
- E — экспонента, хранящаяся со смещением (bias), чтобы избежать хранения знака экспоненты. Для binary32 смещение равно 127, для binary64 — 1023.
- 1 + M — нормализованная мантисса (всегда имеет неявную единицу перед запятой, кроме субнормальных чисел).
Специальные значения
Стандарт определяет несколько особых битовых комбинаций:
- Ноль: когда все биты экспоненты и мантиссы равны нулю. Существует как +0, так и -0.
- Бесконечность: когда все биты экспоненты равны единице, а мантисса равна нулю. Используется для обозначения результата деления ненулевого числа на ноль или переполнения.
- NaN (Not a Number): когда все биты экспоненты равны единице, а мантисса не равна нулю. Возникает при неопределённых операциях (например, 0/0, sqrt(-1)). Различают сигнализирующие (sNaN) и тихие (qNaN) NaN.
- Субнормальные числа: когда экспонента равна нулю, а мантисса не равна нулю. Позволяют представлять числа, меньшие минимального нормализованного значения, с постепенной потерей точности.
Операции и округление
Стандарт определяет пять основных арифметических операций (сложение, вычитание, умножение, деление, квадратный корень) и несколько дополнительных (остаток от деления, преобразование между форматами, сравнение).
Режимы округления
Для получения точного результата, который может не помещаться в формат, стандарт предписывает один из четырёх режимов округления:
- Округление до ближайшего, к чётному (roundTiesToEven): по умолчанию. Результат округляется до ближайшего представимого числа. Если результат находится ровно посередине между двумя числами, выбирается то, у которого младший бит мантиссы равен нулю (чётное).
- Округление до ближайшего, от нуля (roundTiesToAway): аналогично, но при равенстве округляется в сторону от нуля.
- Округление к +∞ (roundTowardPositive): результат всегда округляется вверх.
- Округление к -∞ (roundTowardNegative): результат всегда округляется вниз.
- Округление к нулю (roundTowardZero): дробная часть просто отбрасывается.
Исключения
Стандарт определяет пять типов исключительных ситуаций, которые могут быть обработаны программно:
- Недействительная операция (invalid operation): например, 0/0, sqrt(-1).
- Деление на ноль (division by zero): деление конечного ненулевого числа на ноль.
- Переполнение (overflow): результат слишком велик для представления в данном формате.
- Исчезновение порядка (underflow): результат слишком мал (близок к нулю) и не может быть представлен нормализованным числом.
- Неточный результат (inexact): результат операции не может быть представлен точно и требует округления.
Применение
Стандарт IEEE 754 используется повсеместно:
- Процессоры: все современные x86-64, ARM, RISC-V и другие архитектуры имеют аппаратную поддержку арифметики с плавающей запятой, соответствующую стандарту.
- Языки программирования: типы
floatиdoubleв C, C++, Java, C#, Python, JavaScript и многих других языках соответствуют binary32 и binary64. - Графика и игры: формат binary16 активно применяется в шейдерах и нейронных сетях для экономии памяти и пропускной способности.
- Научные вычисления: double-точность (binary64) является стандартом для большинства численных расчётов.
- Финансовые системы: десятичные форматы (decimal64) используются для точного представления денежных сумм.
Критика и ограничения
Несмотря на широкое распространение, стандарт имеет ряд недостатков:
- Неравномерность точности: числа с плавающей запятой не распределены равномерно по числовой оси. Чем дальше от нуля, тем больше расстояние между соседними представимыми числами.
- Проблема 0.1: десятичная дробь 0.1 не имеет точного двоичного представления, что приводит к накоплению ошибок при многократных вычислениях.
- Сложность обработки NaN: не все языки и библиотеки корректно обрабатывают сигнализирующие NaN, что может приводить к трудно отлавливаемым ошибкам.
- Отсутствие поддержки в некоторых архитектурах: встраиваемые системы и старые процессоры могут не иметь аппаратной поддержки, что вынуждает использовать программную эмуляцию.
Источники
- IEEE Standard for Floating-Point Arithmetic, IEEE Std 754-2019.
- Goldberg, D. (1991). What Every Computer Scientist Should Know About Floating-Point Arithmetic. ACM Computing Surveys, 23(1), 5-48.
- Kahan, W. (1996). Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →