Стандарт IEEE 754

Как известно, существует несколько возможных способов представления в машинной памяти множества вещественных чисел. Более того, вплоть до середины 80-х годов существовало не менее нескольких десятков коммерчески значимых архитектур, каждая из которых имела свою реализацию этих способов. И хотя зачастую эти реализации отличались друг от друга лишь параметрами представления чисел, этот факт превращал процесс разработки стандартных программ для вычислений в сущий кошмар для программистов. Такая ситуация сподвигла разработчиков аппаратного обеспечения на выработку единого стандарта на представление вещественных чисел, окончательно принятого в 1985 году и ныне известного как стандарт IEEE-754.

Стандарт был разработан со следующими целями:

  1. Упростить перенос существующего программного обеспечения на новые платформы, соответствующие данному стандарту.
  2. Предоставить новые возможности, полезные и безопасные, для программистов, которые, не будучи экспертами в численном анализе, могут писать черезвычайно запутанные программы. Впрочем, иногда полезность и безопасность представляются противоречащими друг другу.
  3. Предоставить возможность экспертам писать и распространять устойчивые и эффективные вычислительные программы, которые были бы хорошо переносимыми между машинами, соответствующими данному стандарту. Кроме того, программы, написанные в соответствии со стандартом, должны возвращать идентичные результаты на всех машинах.
  4. Предоставить прямую поддержку диагностики времени исполнения, обработки исключительных ситуаций и интервальной арифметики.
  5. Предоставить возможности для разработки стандартных элементарных функций, высокоточной арифметики и символьных вычислений.

Для этого были определены:

  1. Базовые и расширенные форматы чисел с плавающей точкой
  2. Операции сложения, вычитания, умножения, деления, квадратного корня, остатка и сравнения
  3. Преобразования между целочисленными и плавающими форматами
  4. Преобразования между различными плавающими форматами
  5. Преобразования между базовыми форматами чисел с плавающей точкой и десятичными строками
  6. Исключительные ситуации, возникающие при вычислениях с плавающей точкой, и их обработка, включая вычисления с не-числами

За рамками стандарта остались форматы десятичных строк и чисел, интерпретация знака и мантиссы не-чисел, и преобразования между двоичным и десятичным представлением чисел в расширенных форматах.

Основные определения стандарта IEEE-754.

Смещенный порядок (biased exponent) – сумма порядка и константы (смещения), выбранной так, что сумма неотрицательна.
Двоичное число с плавающей точкой (binary floating point number) – битовая строка, характеризующаяся тремя составляющими: знаком (sign), знаковым порядком (signed exponent) и мантиссой (significand). Ее численное значение (если оно существует) равно произведению знака, мантиссы и двойки, возведенной в степень, равную порядку.
Денормализованное число (denormalized number) – ненулевое число с плавающей точкой, порядок которого имеет некоторое зарезервированное значение (обычно это минимальное представимое в данном формате число), и чей ведущий (явный или неявный бит) нулевой.
Место назначения (destination) – то, куда записывается результат бинарной или унарной операции. Может быть явно назначено пользователем или неявно – системой (к примеру, промежуточные результаты вычисления выражений). Некоторые языки не позволяют пользователям распоряжаться промежуточными результатами. Тем не менее, стандарт описывает результат операции в терминах целевого формата (destination’s format) и значений операндов.
Порядок (exponent) – одна из трех составляющих двоичного числа с плавающей точкой, обычно означающая степень двойки при вычислении значения числа. Иногда порядок называется знаковым (signed) или несмещенным (unbiased).
Дробная часть (fraction) – часть мантиссы, лежащая справа от двоичной точки.
Не-число (NaN) - символическое значение, кодируемое в плавающем формате. Существует два типа не-чисел.
Сигнализирующие не-числа (signaling NaN) генерируют возникновение исключительной ситуации INVALID в случае, когда они встречаются в качестве операндов. «Тихие» не-числа (quiet NaN) могут без всяких исключений существовать на протяжении почти всех вычислительных операций.
Результат (result) – битовая строка (обычно представляющая некоторое число), возвращаемая в место назначения.
Мантисса (significand) – компонента двоичного числа с плавающей точкой, состоящая из явного или неявного ведущего бита слева от подразумеваемой двоичной точки и дробной части справа.
Флаг статуса (status flag) – переменная, которая может принимать два значения. Флаг может быть установленным (set), или неустановленным (clear). Пользователь может очистить флаг, копировать его, или восстановить предыдущее состояние. Будучи установленным, флаг может содержать дополнительную информацию, зависящую от платформы, и, возможно, недоступную некоторым пользователям. Операции, определенные стандартом, могут иметь побочным эффектом выставление следующих флагов: неточный результат (inexact result), исчезновение порядка (underflow), перполнение (overflow), деление на ноль (divide by zero) и неверная операция (invalid operation).
Пользователь (user) – человек, аппаратура или программа, чьи действия не определяются стандартом, имеющий доступ к программному окружению и контролирующий выполнение операций, определяемых стандартом.

Стандарт IEEE-754 на вычисления с плавающей точкой определяет четыре плавающих формата, которые делятся на базовые и расширенные. Уровень соответствия может различаться в зависимости от того, какие форматы реализованы.

Численные значения величин определяются с использованием трех целых параметров:

  1. p - число значащих битов (precision)
  2. e_max - максимальное значение порядка
  3. e_min - минимальное значение порядка

Параметры базовых форматов приведены в таблице:

Формат p e_max e_min Смещение Порядок (бит) Формат (бит)
Single 24 127 -126 127 8 32
Double 53 1023 -1022 1023 11 64

Полезные ссылки