IEEE 754-2008: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
м Исправлены ссылки на отдельные статьи в таблице форматов (по аналогии с англоязычной версией статьи)
Метки: с мобильного устройства из мобильной версии через расширенный мобильный режим
(не показано 25 промежуточных версий 18 участников)
Строка 1: Строка 1:
'''IEEE 754''' ([[Международная электротехническая комиссия|IEC]] 60559) — широко используемый стандарт [[Институт инженеров электротехники и электроники|IEEE]], описывающий формат представления чисел с [[плавающая запятая|плавающей точкой]]. Используется в программных ([[компилятор]]ы с разных [[Язык программирования|языков программирования]]) и аппаратных ([[CPU]] и [[FPU]]) реализациях арифметических действий (математических операций).
'''IEEE 754''' ([[Международная электротехническая комиссия|IEC]] 60559) — широко используемый стандарт [[Институт инженеров электротехники и электроники|IEEE]], описывающий формат представления чисел с [[плавающая запятая|плавающей точкой]]. Используется в программных ([[компилятор]]ы разных [[Язык программирования|языков программирования]]) и аппаратных ([[CPU]] и [[FPU]]) реализациях арифметических действий (математических операций).


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


Формат включает:
Формат включает:
* Числа, которые могут рассматриваться в двоичной или десятичной системе счисления. Вещественное число представляется тремя целыми числами, где S=знак (0 для положительного и 1 для отрицательного), С=[[Мантисса (математика)|мантисса]] (коэффициент), Q=[[экспонента]]. Для заданных целых чисел S, C, Q значением соответствующего вещественного числа является: (−1)<sup>''s''</sup> × ''c'' × ''b<sup>q</sup>'' , где ''b'' является основанием (2 или 10). Например, число с основанием 10, битом знака 1 (число отрицательное), мантиссой 12345 и экспонентой −3 определяют число (−1)<sup>''1''</sup> × 12345 × 10<sup>''−3''</sup> = −12.345.
* Числа, которые могут рассматриваться в двоичной или десятичной системе счисления. Вещественное число представляется тремя целыми числами <math>s</math>, <math>c</math> и <math>q</math>, где <math>s</math> — знак (0 для положительного и 1 для отрицательного), <math>c</math> — [[Мантисса (математика)|мантисса]] (коэффициент), <math>q</math> — [[экспонента]]. Для заданных целых чисел <math>s</math>, <math>c</math> и <math>q</math> значением соответствующего вещественного числа является: <math>(-1)^s \cdot c \cdot b^q</math>, где <math>b</math> является основанием (2 или 10). Например, число с основанием <math>10</math>, битом знака <math>1</math> (число отрицательное), мантиссой <math>12345</math> и экспонентой <math>-3</math> определяют число <math>(-1)^1 \cdot 12345 \cdot 10^{-3} = -12.345</math>.


* Положительный нуль +0 и [[−0 (программирование)|отрицательный нуль −0]].
* Положительный нуль <math>+0</math> и [[−0 (программирование)|отрицательный нуль <math>-0</math>]].
* Две бесконечности: + и −∞.
* Две бесконечности: <math>+\infty</math> и <math>-\infty</math>.
* Два вида [[NaN]]: тихий NaN (qNaN) и сигнализационный NaN (sNaN). NaN может нести полезную нагрузку, предназначенный для диагностической информации, указывающей источник, вызвавший NaN. Знак NaN не имеет никакого значения, но может быть предсказуемым в некоторых случаях.
* Два вида [[NaN]]: тихий NaN (qNaN) и сигнальный NaN (sNaN). NaN может нести полезную нагрузку, предназначенную для диагностической информации, указывающей источник, вызвавший NaN. Знак NaN не имеет никакого значения, но может быть предсказуемым в некоторых случаях.
Возможные конечные значения, которые могут быть представлены в формате, определяются основанием b, количеством знаков в мантиссе (с точностью р) и максимальным значением emax:
Возможные конечные значения, которые могут быть представлены в формате, определяются основанием <math>b</math>, числом знаков в мантиссе (с точностью <math>p</math>) и максимальным значением <math>E_\max</math>:
* ''c'' должен быть целым числом в диапазоне от нуля до ''b<sup>p</sup>''−1 (если ''b''=10 и ''p''=7 тогда с может быть от 0 до 9999999)
* <math>c</math> должен быть целым числом в диапазоне от нуля до <math>b^p - 1</math> (если <math>b = 10</math> и <math>p = 7</math> тогда с может быть от <math>0</math> до <math>9999999</math>)
* ''q'' должно быть целым числом, чтобы 1−''emax'' ''q''+''p''−1 ''emax'' (если ''p''=7 и ''emax''=96 тогда q может быть от −101 до 90).
* <math>q</math> должно быть целым числом, чтобы <math>1 - E_\max \le q + p - 1 \le E_\max</math> (если <math>p = 7</math> и <math>E_\max = 96</math>, то <math>q</math> может быть от <math>-101</math> до <math>90</math>).


Следовательно (для предыдущего примера) наименьшее отличное от нуля положительное число, которое может быть представлено 1 × 10<sup>−101</sup> а самым большим 9999999 × 10<sup>90</sup> (9,999999 × 10<sup>96</sup>), а также полный спектр чисел от −9,999999 × 10<sup>96</sup> до 9,999999 × 10<sup>96</sup>. Числа -b<sup>1-emax</sup> и b1<sup>-emax</sup> (−1 × 10<sup>−95</sup> и 1 × 10<sup>−95</sup>) являются самыми маленькими (по абсолютной величине) нормальными числами; ненулевые числа между этими наименьшими числами называются [[Субнормальный ряд|субнормальные]].
Следовательно (для предыдущего примера) наименьшее отличное от нуля положительное число, которое может быть представлено — <math>1 \cdot 10^{-101}</math>, а самым большим <math>9999999 \cdot 10^{90}</math> (<math>9.999999 \cdot 10^{96}</math>), а также полный спектр чисел от <math>-9.999999 \cdot 10^{-96}</math> до <math>9.999999 \cdot 10^{-96}</math>. Числа <math>-b^{E_\max}</math> и <math>b^{E_\max}</math> (<math>-1 \cdot 10^{-95}</math> и <math>1 \cdot 10^{-95}</math>) являются самыми маленькими (по абсолютной величине) нормальными числами; ненулевые числа между этими наименьшими числами называются [[Денормализованные числа|субнормальные]].


=== Представление и кодирование в памяти ===
=== Представление и кодирование в памяти ===
Некоторые числа могут иметь несколько представлений в формате, в котором они были только что описаны. Например, если b = 10 и р = 7, то число −12,345 может быть представлено как: −12345 × 10<sup>−3</sup>, −123450 × 10<sup>−4</sup> или −1234500 × 10<sup>−5</sup>.
Некоторые числа могут иметь несколько представлений в формате, в котором они были только что описаны. Например, если <math>b = 10</math> и <math>p = 7</math>, то число <math>-12.345</math> может быть представлено как: <math>-12345 \cdot 10^{-3}</math>, <math>-123450 \cdot 10^{-4}</math> или <math>-1234500 \cdot 10^{-5}</math>.


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


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


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


{|class="wikitable"
{|class="wikitable"
! Название !! Полное
! Название !! Полное название
! Основание !! Число двоичных разрядов мантиссы
название
! Число десятичных разрядов !!Экспонента (бит)!! Десятичный<br>E max !! Смещение экспоненты<ref name=DAE>{{cite web|last1=Cowlishaw|first1=Mike|title=Decimal Arithmetic Encodings|url=http://speleotrove.com/decimal/decbits.pdf|publisher=IBM|accessdate=2015-08-06|archive-date=2016-02-08|archive-url=https://web.archive.org/web/20160208051032/http://speleotrove.com/decimal/decbits.pdf|deadlink=no}}</ref> !! E min !! E max !! Примечания
! Основание !! Кол-во двоичных
разрядов мантиссы
! Число десятичных разрядов !!Экспонента (бит)!! Десятичный<br/>E max !! Смещение экспоненты<ref name=DAE>{{cite web|last1=Cowlishaw|first1=Mike|title=Decimal Arithmetic Encodings|url=http://speleotrove.com/decimal/decbits.pdf|publisher=IBM|accessdate=6 August 2015}}</ref> !! E min !! E max !! Примечания
|-
|-
|[[Число половинной точности|binary16]]||Половинная точность
|[[Число половинной точности|binary16]]||Половинная точность
| align="right" | 2||align="right"| 11||align="right"| 3.31||align="right"| 5 ||align="right"| 4.51||2<sup>4</sup>−1 = 15 ||align="right"| −14||align="right"| +15||Не основной
| align="right" | 2||align="right"| 11||align="right"| 3,31||align="right"| 5 ||align="right"| 4,51||2<sup>4</sup>−1 = 15 ||align="right"| −14||align="right"| +15||Не основной
|-
|-
|[[Число одинарной точности|binary32]]||Одинарная точность
|[[Число одинарной точности|binary32]]||Одинарная точность
| align="right" | 2||align="right"| 24||align="right"| 7.22||align="right"| 8 ||align="right"| 38.23||2<sup>7</sup>−1 = 127 ||align="right"| −126||align="right"| +127||
| align="right" | 2||align="right"| 24||align="right"| 7,22||align="right"| 8 ||align="right"| 38,23||2<sup>7</sup>−1 = 127 ||align="right"| −126||align="right"| +127||
|-
|-
|[[Число двойной точности|binary64]]||Двойная точность
|[[Число двойной точности|binary64]]||Двойная точность
| align="right" | 2||align="right"| 53||align="right"|15.95||align="right"|11 ||align="right"| 307.95||2<sup>10</sup>−1 = 1023 ||align="right"| −1022||align="right"| +1023||
| align="right" | 2||align="right"| 53||align="right"|15,95||align="right"|11 ||align="right"| 307,95||2<sup>10</sup>−1 = 1023 ||align="right"| −1022||align="right"| +1023||
|-
|-
|[[Число четверной точности|binary128]]||Четырёхкратная точность
|[[Число четверной точности|binary128]]||Четырёхкратная точность
| align="right" | 2||align="right"|113||align="right"|34.02||align="right"|15 ||align="right"|4931.77||2<sup>14</sup>−1 = 16383||align="right"|−16382||align="right"|+16383||
| align="right" | 2||align="right"|113||align="right"|34,02||align="right"|15 ||align="right"|4931,77||2<sup>14</sup>−1 = 16383||align="right"|−16382||align="right"|+16383||
|-
|-
|[[Число восьмикратной точности|binary256]]||Восьмикратная точность
|[[Число восьмикратной точности|binary256]]||Восьмикратная точность
| align="right" | 2||align="right"|237||align="right"|71.34||align="right"|19 ||align="right"|78913.2||2<sup>18</sup>−1 = 262143||align="right"|−262142||align="right"|+262143||Не основной
| align="right" | 2||align="right"|237||align="right"|71,34||align="right"|19 ||align="right"|78913.2||2<sup>18</sup>−1 = 262143||align="right"|−262142||align="right"|+262143||Не основной
|-
|-
|decimal32 || ||align="right"|10||align="right"| 7||align="right"| 7 ||align="right"| 7.58||align="right"| 96 || 101||align="right"| −95||align="right"| +96||Не основной
|decimal32 || ||align="right"|10||align="right"| 7||align="right"| 7 ||align="right"| 7,58||align="right"| 96 || 101||align="right"| −95||align="right"| +96||Не основной
|-
|-
|decimal64 || ||align="right"|10||align="right"| 16||align="right"|16 ||align="right"| 9.58||align="right"| 384 || 398||align="right"| −383||align="right"| +384||
|decimal64 || ||align="right"|10||align="right"| 16||align="right"|16 ||align="right"| 9,58||align="right"| 384 || 398||align="right"| −383||align="right"| +384||
|-
|-
|decimal128 || ||align="right"|10||align="right"| 34||align="right"|34 ||align="right"|13.58||align="right"|6144 || 6176||align="right"| −6143||align="right"| +6144||
|decimal128 || ||align="right"|10||align="right"| 34||align="right"|34 ||align="right"|13,58||align="right"|6144 || 6176||align="right"| −6143||align="right"| +6144||
|}
|}
Обратите внимание: в приведенной выше таблице минимальные показатели указаны для обычных чисел. Специальное представление субнормальных чисел позволяет представить даже меньшие числа (с некоторой потерей точности). Например, наименьшее число двойной точности, большее нуля, которое может быть представлено в этой форме, равно 2<sup>−1074</sup> (потому что 1074 = 1022 + 53 − 1).
Обратите внимание: в приведенной выше таблице минимальные показатели указаны для обычных чисел. Специальное представление субнормальных чисел позволяет представить даже меньшие числа (с некоторой потерей точности). Например, наименьшее число двойной точности, большее нуля, которое может быть представлено в этой форме, равно 2<sup>−1074</sup> (потому что 1074 = 1022 + 53 − 1).
[[Файл:IEEE754.png|мини|297x297пкс|Точность binary32 и binary64 в диапазоне от 10<sup>−12</sup> до 10<sup>12</sup>.]]
[[Файл:IEEE754.svg|мини|297x297пкс|Точность binary32 и binary64 в диапазоне от 10<sup>−12</sup> до 10<sup>12</sup>.]]
Десятичное значение - это ''значение'' × log<sub>10</sub> ''основание'', это дает приблизительную точность в десятичной системе.
Десятичное значение — это ''значение'' × log<sub>10</sub> ''основание'', это дает приблизительную точность в десятичной системе.


Десятичное E max - это ''emax'' × log<sub>10</sub> ''основание,'' это дает максимальную степень в десятичном формате.
Десятичное E max — это ''emax'' × log<sub>10</sub> ''основание,'' это дает максимальную степень в десятичном формате.


Как было указано ранее, форматы binary32 и binary64 идентичны форматам IEEE 754—1985 и являются двумя наиболее распространенными форматами, используемыми сегодня. На рисунке справа показана абсолютная точность для форматов binary32 и binary64 в диапазоне от 10<sup>−12</sup> до 10<sup>12</sup>. Такой показатель может быть использован для выбора подходящего формата с учетом ожидаемого значения числа и требуемой точности.
Как было указано ранее, форматы binary32 и binary64 идентичны форматам IEEE 754—1985 и являются двумя наиболее распространенными форматами, используемыми сегодня. На рисунке справа показана абсолютная точность для форматов binary32 и binary64 в диапазоне от 10<sup>−12</sup> до 10<sup>12</sup>. Такой показатель может быть использован для выбора подходящего формата с учётом ожидаемого значения числа и требуемой точности.


=== Расширенные и расширяемые форматы точности ===
=== Расширенные и расширяемые форматы точности ===
Строка 114: Строка 112:


=== Округление к ближайшему ===
=== Округление к ближайшему ===
* Округление к ближайшему (привязка к четному). Если два ближайших числа с плавающей точкой одинаково близки, то должно быть получено число с чётной самой младшей цифрой. Это вариант по умолчанию для двоичной плавающей запятой и рекомендованный вариант по умолчанию для десятичного числа.
* Округление к ближайшему (привязка &laquo;к четному&raquo;). Если два ближайших числа с плавающей точкой одинаково близки, то должно быть получено число с чётной самой младшей цифрой. Это вариант по умолчанию для двоичной плавающей запятой и рекомендованный вариант по умолчанию для десятичного числа.
* Округление к ближайшему (привязка к бесконечности). Если два ближайших числа с плавающей точкой одинаково близки, то должно быть получено число с большим модулем.
* Округление к ближайшему (привязка &laquo;к бесконечности&raquo;). Если два ближайших числа с плавающей точкой одинаково близки, то должно быть получено число с большим модулем.


=== Направленные округления ===
=== Направленные округления ===
Строка 125: Строка 123:
|+ Пример округления до целых чисел
|+ Пример округления до целых чисел
! Режим / Пример
! Режим / Пример
! +11.5
! +11,5
! +12.5
! +12,5
! −11.5
! −11,5
! −12.5
! −12,5
|-
|-
|к ближайшему (привязка к четному)
|к ближайшему (привязка к четному)
| +12.0
| +12,0
| +12.0
| +12,0
| −12.0
| −12,0
| −12.0
| −12,0
|-
|-
|к ближайшему (привязка к бесконечности)
|к ближайшему (привязка к бесконечности)
| +12.0
| +12,0
| +13.0
| +13,0
| −12.0
| −12,0
| −13.0
| −13,0
|-
|-
|к 0
|к 0
| +11.0
| +11,0
| +12.0
| +12,0
| −11.0
| −11,0
| −12.0
| −12,0
|-
|-
|к + ∞
|к + ∞
| +12.0
| +12,0
| +13.0
| +13,0
| −11.0
| −11,0
| −12.0
| −12,0
|-
|-
|к - ∞
|к - ∞
| +11.0
| +11,0
| +12.0
| +12,0
| −12.0
| −12,0
| −13.0
| −13,0
|}
|}


Строка 187: Строка 185:


== Ссылки ==
== Ссылки ==
* [http://ieeexplore.ieee.org/xpl/freeabs_all.jsp%3Farnumber%3D4610935&usg=ALkJrhjFQm63fwj6vZaa_nXfHzRYhg4mDA 754-2008 — IEEE Standard for Floating-Point Arithmetic. Revision of ANSI/IEEE Std 754-1985] // ieeexplore.ieee.org, 2008 ISBN 978-0-7381-5752-8, [[doi:10.1109/IEEESTD.2008.4610935]] {{платно}}
* [https://ieeexplore.ieee.org/document/8766229 754-2019 — IEEE Standard for Floating-Point Arithmetic. Revision of IEEE Std 754-2008] // ieeexplore.ieee.org, ISBN: 2019 978-1-5044-5924-2, [[doi:10.1109/IEEESTD.2019.8766229]] {{платно}}
* [https://ieeexplore.ieee.org/document/4610935 754-2008 — IEEE Standard for Floating-Point Arithmetic. Revision of ANSI/IEEE Std 754-1985] // ieeexplore.ieee.org, 2008 ISBN 978-0-7381-5752-8, [[doi:10.1109/IEEESTD.2008.4610935]] {{платно}}
* {{cite web|url=http://www.softelectro.ru/ieee754.html|title=IEEE 754 — стандарт двоичной арифметики с плавающей точкой|author=Яшкардин В. Л.|date=2009|publisher=SoftElectro|archiveurl=https://www.webcitation.org/66HxLoJLV?url=http://www.softelectro.ru/ieee754.html|archivedate=2012-03-19}}
* {{cite web|url=http://www.softelectro.ru/ieee754.html|title=IEEE 754 — стандарт двоичной арифметики с плавающей точкой|author=Яшкардин В. Л.|date=2009|publisher=SoftElectro|archiveurl=|archivedate=}}
* [https://web.archive.org/web/20070424205950/http://www.h-schmidt.net/FloatApplet/IEEE754.html IEEE 754 Converter]
* [https://web.archive.org/web/20070424205950/http://www.h-schmidt.net/FloatApplet/IEEE754.html IEEE 754 Converter]
* [http://www.binaryconvert.com/index.html IEEE754 онлайн двоично-десятичный преобразователь]
* [http://www.binaryconvert.com/index.html IEEE754 онлайн двоично-десятичный преобразователь]


{{comp-stub}}
{{нет сносок}}
{{нет сносок}}



Версия от 20:35, 3 апреля 2023

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

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

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

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

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

Разработка стандарта

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

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

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

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

Формат

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

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

  • Числа, которые могут рассматриваться в двоичной или десятичной системе счисления. Вещественное число представляется тремя целыми числами , и , где — знак (0 для положительного и 1 для отрицательного), мантисса (коэффициент), экспонента. Для заданных целых чисел , и значением соответствующего вещественного числа является: , где является основанием (2 или 10). Например, число с основанием , битом знака (число отрицательное), мантиссой и экспонентой определяют число .
  • Положительный нуль и отрицательный нуль .
  • Две бесконечности: и .
  • Два вида NaN: тихий NaN (qNaN) и сигнальный NaN (sNaN). NaN может нести полезную нагрузку, предназначенную для диагностической информации, указывающей источник, вызвавший NaN. Знак NaN не имеет никакого значения, но может быть предсказуемым в некоторых случаях.

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

  • должен быть целым числом в диапазоне от нуля до (если и тогда с может быть от до )
  • должно быть целым числом, чтобы (если и , то может быть от до ).

Следовательно (для предыдущего примера) наименьшее отличное от нуля положительное число, которое может быть представлено — , а самым большим — (), а также полный спектр чисел от до . Числа и ( и ) являются самыми маленькими (по абсолютной величине) нормальными числами; ненулевые числа между этими наименьшими числами называются субнормальные.

Представление и кодирование в памяти

Некоторые числа могут иметь несколько представлений в формате, в котором они были только что описаны. Например, если и , то число может быть представлено как: , или .

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

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

Основные и взаимозаменяемые форматы

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

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

Название Полное название Основание Число двоичных разрядов мантиссы Число десятичных разрядов Экспонента (бит) Десятичный
E max
Смещение экспоненты[1] E min E max Примечания
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).

Точность binary32 и binary64 в диапазоне от 10−12 до 1012.

Десятичное значение — это значение × log10 основание, это дает приблизительную точность в десятичной системе.

Десятичное E max — это emax × log10 основание, это дает максимальную степень в десятичном формате.

Как было указано ранее, форматы binary32 и binary64 идентичны форматам IEEE 754—1985 и являются двумя наиболее распространенными форматами, используемыми сегодня. На рисунке справа показана абсолютная точность для форматов binary32 и binary64 в диапазоне от 10−12 до 1012. Такой показатель может быть использован для выбора подходящего формата с учётом ожидаемого значения числа и требуемой точности.

Расширенные и расширяемые форматы точности

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

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

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

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

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

Форматы обмена

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

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

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

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

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

Правила округления

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

Округление к ближайшему

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

Направленные округления

  • Округление к 0 - направленное округление к нулю (также известное как усечение).
  • Округление к + ∞ - направленное округление к положительной бесконечности (также известное как округление вверх или потолок).
  • Округление к - ∞ - направленное округление к отрицательной бесконечности (также известное как округление вниз или пол).
Пример округления до целых чисел
Режим / Пример +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. Cowlishaw, Mike Decimal Arithmetic Encodings. IBM. Дата обращения: 6 августа 2015. Архивировано 8 февраля 2016 года.

Ссылки