IEEE 754-2008

Материал из Википедии — свободной энциклопедии
(перенаправлено с «IEEE 754»)
Перейти к: навигация, поиск

IEEE 754 (IEC 60559) — широко используемый стандарт IEEE, описывающий формат представления чисел с плавающей точкой. Используется в программных (компиляторы с разных языков программирования) и аппаратных (CPU и FPU) реализациях арифметических действий (математических операций).

Стандарт описывает:

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

Список стандартов:

  • IEEE 754—1985;
  • IEEE 754—1997;
  • IEEE 754—2008.

Разработка стандарта[править | править вики-текст]

Текущая версия IEEE 754—2008 была опубликована в 2008 году. Она дополняет и заменяет предыдущую версию IEEE 754-1985, созданную Dan Zuras и отредактированную Mike Cowlishaw.

Международный стандарт ISO/IEC/IEEE 60559:2011 (с идентичным IEEE 754—2008) был одобрен и опубликован для JTC1/SC 25 под соглашением ISO/IEEE PSDO.

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

По состоянию на сентябрь 2015 года, стандарт пересматривается с целью включения уточнений.

Формат[править | править вики-текст]

Формат IEEE 754 представляет собой «совокупность представлений числовых значений и символов». Формат может также включать в себя, способ кодирования.

Формат включает в себя:

  • Конечные цифры, которые могут быть с основанием 2 (двоичная) либо с основанием 10 (десятичная система). Каждое конечное число описывается тремя целыми числами: s = знак (ноль или один), с = мантисса (коэффициент), Q = экспонента. Численное значение конечного числа является: (−1)s × c × bq где b является основанием (2 или 10). Например, если основание 10, знак равен 1 (обозначающий отрицательное число), мантисса 12345, и экспонента равна −3, тогда значение числа будет −11 × 12345 × 10−3 = −1 × 12345 × .001 = −12.345.
  • Две бесконечности: +∞ и −∞.
  • Два вида NaN: тихий NaN (qNaN) и сигнализационный NaN (sNaN). NaN может нести полезную нагрузку, предназначенный для диагностической информации, указывающей источник NaN. Знак NaN не имеет никакого значения, но может быть предсказуемым в некоторых обстоятельствах.

Возможные конечные значения, которые могут быть представлены в формате, определяются основанием b, количеством цифр в мантиссе (с точностью р) и максимальным значением emax:

  • c должен быть целым числом в диапазоне от нуля до bp−1 (если b=10 и p=7 тогда c может быть от 0 до 9999999)
  • q должно быть целым числом, чтобы 1−emaxq+p−1 ≤ emax (если p=7 и emax=96 тогда q может быть от −101 до 90).

Следовательно (для предыдущего примера) наименьшее отличное от нуля положительное число, которое может быть представлено 1 × 10-101 а самым большым 9999999 × 1090 (9,999999 × 1096), а также полный спектр чисел от −9,999999 × 1096 до 9,999999 × 1096. Числа -b1-Emax и b1-Emax (здесь, −1 × 10-95 и 1 × 10-95) являются самыми маленькими (по абсолютной величине) нормальными числами; ненулевые числа между этими наименьшими числами называются субнормальные.

Так же в стандарте предусматривается возможность сохранить 0. +0 и −0 являются разными числами.

Представление и кодирование в памяти[править | править вики-текст]

Некоторые числа могут иметь несколько представлений в формате, в котором они были только что описаны. Например, если b = 10 и р = 7, −12,345 могут быть представлены −12345 × 10-3, −123450 × 10-4 и −1234500 × 10-5. Тем не менее, для большинства операций, таких как арифметические операции, результат (значение) не зависит от представления входов.

Для десятичных форматов, любое представление справедливо, и совокупность этих представлений называется когортами. Когда результат может иметь несколько представлений, стандарт определяет, какой выбран членом когорты.

Для бинарных форматов, представление делается уникальным путём выбора наименьшего представляемого показателя. Для чисел с показателем в нормальном диапазоне (не все из них или все нули), ведущий бит мантиссы всегда будет равен 1. Следовательно, ведущий 1 бит может подразумеваться, а не сохраняться явно в памяти. Это правило называется ведущей битной конвенцией или скрытой битной конвенцией. Правило позволяет сберечь 1 бит памяти, чтобы иметь ещё один бит точности. Ведущий бит конвенции не используется для субнормальных чисел; их показатель находится за пределами нормального диапазона значений.

Основные и взаимозаменяемые форматы[править | править вики-текст]

Стандарт определяет пять основных форматов, которые названы по их числовой базе и количеству бит, используемых в их кодировке. Существуют три базовых формата двоичной плавающей запятой (закодированные с 32, 64 или 128 битами) и два десятичных формата с плавающей запятой (кодируются 64 или 128 битами). Форматы binary32 и binary64 - это одиночные и двойные форматы IEEE 754-1985. Соответствующая реализация должна полностью реализовать по крайней мере один из основных форматов.

В стандарте также определены форматы обмена, которые обобщают эти основные форматы. Для двоичных единиц требуется соглашение с ведущими битами. В таблице перечислены наименьшие форматы обмена (включая базовые).

Name Common name Base Digits Decimal
digits
Exponent
bits
Decimal
E max
Exponent
bias[1]
E min E max Notes
binary16 Половинная точность 2 11 3.31 5 4.51 24−1 = 15 −14 +15 Не основной
binary32 Одиночная точность 2 24 7.22 8 38.23 27−1 = 127 −126 +127
binary64 Двойная точность 2 53 15.95 11 307.95 210−1 = 1023 −1022 +1023
binary128 Четырёхкратная точность 2 113 34.02 15 4931.77 214−1 = 16383 −16382 +16383
binary256 восьмикратная точность 2 237 71.34 19 78913.2 218−1 = 262143 −262142 +262143 Не основной
decimal32 10 7 7 7.58 96 101 −95 +96 Не основной
decimal64 10 16 16 9.58 384 398 −383 +384
decimal128 10 34 34 13.58 6144 6176 −6143 +6144

Обратите внимание: в приведенной выше таблице минимальные показатели указаны для обычных чисел; Специальное представление субнормальных чисел позволяет представить даже меньшие числа (с некоторой потерей точности). Например, наименьшее число двойной точности, большее нуля, которое может быть представлено в этой форме, равно 2-1074 (потому что 1074 = 1022 + 53 - 1).

Десятичные цифры - это цифры × log10, это дает приблизительную точность в десятичной системе. Десятичное E max - база данных Emax × log10, это дает максимальный показатель в десятичном формате. Как было указано ранее, форматы binary32 и binary64 идентичны форматам IEEE 754-1985 являются двумя наиболее распространенными форматами, используемыми сегодня. На рисунке ниже показана абсолютная точность для форматов binary32 и binary64 в диапазоне от 10-12 до 10 + 12. Такой показатель может быть использован для выбора подходящего формата с учетом ожидаемого значения числа и требуемой точности.

Расширенные и расширяемые форматы точности[править | править вики-текст]

Стандарт определяет расширенные и расширяемые форматы точности, которые рекомендованы для обеспечения большей точности, чем базовые форматы. Расширенный формат точности расширяет базовый формат, используя более высокую точность и более широкий диапазон экспоненты. Расширенный формат точности позволяет пользователю задавать диапазон точности и экспоненты. Реализация может использовать любое внутреннее представление, которое оно выбирает для таких форматов; Все, что нужно определить, - это его параметры (b, p и emax). Эти параметры однозначно описывают множество конечных чисел (комбинаций знака и экспоненты для данного основания), которые он может представлять.

В стандарте рекомендуется, чтобы языки предоставляли метод задания p и emax для каждой поддерживаемой базы b.

В стандарте рекомендуется, чтобы языки и реализации поддерживали расширенный формат, который имеет большую точность, чем самый большой базовый формат, поддерживаемый для каждого подмножества b.

Для расширенного формата с точностью между двумя основными форматами диапазон экспоненты должен быть таким же большим, как у следующего более широкого базового формата. Так, например, 64-битное расширенное двоичное число с расширенной точностью должно иметь значение «emax» не менее 16383.

Форматы обмена[править | править вики-текст]

Форматы обмена предназначены для обмена данными с плавающей запятой с использованием битовой строки фиксированной длины для заданного формата.

Для обмена двоичными числами с плавающей запятой определены форматы обмена длиной 16 бит, 32 бита, 64 бита и любое краткое из 32 битов ≥128. 16-разрядный формат предназначен для обмена или хранения небольших чисел (например, для графики).

Схема кодирования для этих двоичных форматов обмена такая же, как и для IEEE 754-1985: знаковый бит, за которым следуют индексы, которые описывают смещение экспоненты, и p-1 биты, которые описывают значение. Ширина поля экспоненты для k-битового формата вычисляется как w = (4 log2 (k)) - 13. Существующие 64- и 128-битные форматы следуют этому правилу, но 16- и 32-битные форматы имеют больше битов степени (5 и 8), чем эта формула предоставила бы (3 и 7 соответственно).

Как и в IEEE 754-1985, существует некоторая гибкость в кодировании NaN.

Для обмена десятичными числами с плавающей запятой определены форматы обмена для любого кратного 32 бита.

Правила округления[править | править вики-текст]

Стандарт определяет пять правил округления. Первые два правила округляются до ближайшего значения; Другие называются направленными округлениями:

Округление до ближайшего[править | править вики-текст]

  •     Округление до ближайшего (привязка к четному) - округление до ближайшего значения; Если число падает на полпути, округляется до ближайшего значения с четным (нулевым) наименее значимым битом, который происходит в 50% времени; Это значение для двоичной плавающей запятой и рекомендуемое значение по умолчанию для десятичного числа.
  •     Округление до ближайшего (привязка от нуля) - до ближайшего значения; Если число падает на полпути, округляется до ближайшего значения (для положительных чисел) или ниже (для отрицательных чисел); Это предназначено как опция для десятичной плавающей запятой.

Направленные округления[править | править вики-текст]

  •     Округление до 0 - направленное округление к нулю (также известное как усечение).
  •     Округление до + ∞ - направленное округление к положительной бесконечности (также известное как округление вверх или потолок).
  •     Округление до - ∞ - направленное округление к отрицательной бесконечности (также известное как округление вниз или пол).
Пример округления до целых чисел
Mode / Example Value +11.5 +12.5 −11.5 −12.5
до ближайшего (привязка к четному) +12.0 +12.0 −12.0 −12.0
до ближайшего (привязка от нуля) +12.0 +13.0 −12.0 −13.0
до 0 +11.0 +12.0 −11.0 −12.0
до + ∞ +12.0 +13.0 −11.0 −12.0
до - ∞ +11.0 +12.0 −12.0 −13.0

Необходимые операции[править | править вики-текст]

Требуемые операции для поддерживаемого арифметического формата (включая базовые форматы) включают в себя:

  •     Арифметические операции (сложение, вычитание, умножение, деление, квадратный корень, слияние нескольких умножений, остаток)
  •     Конверсии (между форматами, строками и т. Д.)
  •     Масштабирование и (для десятичных) квантование
  •     Копирование и манипулирование знаками (абс, отрицание и т. Д.)
  •     Сравнение и общий порядок
  •     Классификация и испытание для NaN и т. Д.
  •     Флаги тестирования и установки
  •     Прочие операции

Предикат общего порядка[править | править вики-текст]

Стандарт предоставляет предикат totalOrder, который определяет общий порядок для всех чисел с плавающей точкой для каждого формата. Предикат согласуется с обычными операциями сравнения. Однако обычные операции сравнения обрабатывают NaN как неупорядоченные и сравнивают -0 и +0 как равные. Предикат totalOrder будет упорядочивать эти случаи, и он также различает различные представления NaN и одно и то же число десятичных чисел с плавающей запятой, закодированное различными способами.

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

  1. Decimal Arithmetic Encodings. IBM. Проверено 6 августа 2015.

Ссылки[править | править вики-текст]