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

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 (половинная точность)161510±6.5×10⁻⁵ … ±6.5×10⁴~3.3
binary32 (одинарная точность, float)321823±1.2×10⁻³⁸ … ±3.4×10³⁸~7.2
binary64 (двойная точность, double)6411152±2.2×10⁻³⁰⁸ … ±1.8×10³⁰⁸~15.9
binary128 (четверная точность)128115112±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.
  • Субнормальные числа: когда экспонента равна нулю, а мантисса не равна нулю. Позволяют представлять числа, меньшие минимального нормализованного значения, с постепенной потерей точности.

Операции и округление

Стандарт определяет пять основных арифметических операций (сложение, вычитание, умножение, деление, квадратный корень) и несколько дополнительных (остаток от деления, преобразование между форматами, сравнение).

Режимы округления

Для получения точного результата, который может не помещаться в формат, стандарт предписывает один из четырёх режимов округления:

  1. Округление до ближайшего, к чётному (roundTiesToEven): по умолчанию. Результат округляется до ближайшего представимого числа. Если результат находится ровно посередине между двумя числами, выбирается то, у которого младший бит мантиссы равен нулю (чётное).
  2. Округление до ближайшего, от нуля (roundTiesToAway): аналогично, но при равенстве округляется в сторону от нуля.
  3. Округление к +∞ (roundTowardPositive): результат всегда округляется вверх.
  4. Округление к -∞ (roundTowardNegative): результат всегда округляется вниз.
  5. Округление к нулю (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 →