stringtranslate.com

Формат с плавающей точкой decimal64

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

Decimal64 с плавающей точкой — относительно новый десятичный формат с плавающей точкой, официально представленный в версии IEEE 754 2008 года [ 1] , а также в стандарте ISO/IEC/IEEE 60559:2011 . [2]

Формат

Decimal64 поддерживает 16 десятичных цифр мантиссы и диапазон экспоненты от −383 до +384, т. е. от ±0,000 000 000 000 000 × 10 −383^ до ±9,999 999 999 999 999 × 10 384^ . (Эквивалентно, от ±0 000 000 000 000 000 × 10 −398^ до ±9 999 999 999 999 999 × 10 369^ .) Напротив, соответствующий двоичный формат, который является наиболее часто используемым типом, имеет приблизительный диапазон от ±0,000 000 000 000 001 × 10 −308^ до ±1,797 693 134 862 315 × 10 308^ . Поскольку значащая часть не нормализована, большинство значений с менее чем 16 значащими цифрами имеют несколько возможных представлений; 1 × 10 2 = 0,1 × 10 3 = 0,01 × 10 4 и т. д. Этот набор представлений для одного и того же значения называется когортой . Ноль имеет 768 возможных представлений (1536, если включены оба знаковых нуля , в двух разных когортах).

Кодирование значений decimal64

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

Оба варианта предоставляют абсолютно одинаковый набор представимых чисел: 16 цифр мантиссы и 3 × 2 8 = 768 возможных значений десятичного показателя степени. (Все возможные значения десятичного показателя степени, хранимые в числе binary64 , представимы в decimal64, и большинство бит мантиссы binary64 хранятся с примерно одинаковым количеством десятичных цифр в мантиссе.)

В обоих случаях самые значимые 4 бита мантиссы (которые на самом деле имеют только 10 возможных значений) объединяются с самыми значимыми 2 битами экспоненты (3 возможных значения) для использования 30 из 32 возможных значений 5-битного поля. Оставшиеся комбинации кодируют бесконечности и NaN .

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

Поле двоичного целого числа

В этом формате используется двоичная мантисса от 0 до 10 16 − 1 = 9 999 999 999 999 999 = 2386F26FC0FFFF 16 = 1000 1110000110 1111001001 1011111100 0000111111 1111111111 2 .

Кодировка, полностью хранящаяся в 64 битах, может представлять двоичные мантиссы до 10 × 2 50 − 1 = 11 258 999 068 426 239 = 27FFFFFFFFFFFF 16 , но значения больше 10 16 − 1 являются недопустимыми (и стандарт требует, чтобы реализации рассматривали их как 0, если они встречаются на входе).

Как описано выше, кодировка меняется в зависимости от того, является ли наиболее значимым4 бита мантиссы находятся в диапазоне от 0 до 7 (от 0000 2 до 0111 2 ) или выше (1000 2 или 1001 2 ).

Если 2 после знакового бита равны «00», «01» или «10», то поле экспоненты состоит из10 бит, следующих за битом знака, а значимая часть — это оставшееся53 бита , с неявным ведущим0 бит :

s 00eeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttts 01eeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttts 10eeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt

Сюда входят субнормальные числа , у которых первая значащая цифра равна 0.

Если2 бита после знакового бита равны «11», затем 10-битное поле экспоненты сдвигается2 бита вправо (после знакового бита и битов «11» после него), а представленная мантисса находится в оставшихся51 бит . В этом случае имеется неявная (то есть не сохраненная) ведущая 3-битная последовательность «100» для большинства бит истинной мантиссы (в оставшихся младших битах ttt...ttt мантиссы используются не все возможные значения).

s 1100eeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttts 1101eeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttts 1110eeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt

2-битная последовательность "11" после бита знака указывает на то, что к мантиссе есть неявный 3-битный префикс "100". Сравните наличие неявного 1-битного префикса "1" в мантиссе обычных значений для двоичных форматов. 2-битные последовательности "00", "01" или "10" после бита знака являются частью поля экспоненты.

Ведущие биты поля значащей не кодируют самую старшую десятичную цифру; они просто являются частью большего чисто двоичного числа. Например, значащая часть 8 000 000 000 000 000 кодируется как двоичное число 0111 0001101011 1111010100 1001100011 0100000000 0000000000 2 , с ведущим4 бита кодируют 7; первая значимая часть, требующая 54-го бита, равна 2 53 = 9 007 199 254 740 992. Самая высокая допустимая значимая часть равна 9 999 999 999 999 999 , двоичное кодирование которой равно (100)0 1110000110 1111001001 1011111100 0000111111 1111111111 2 (при этом 3 самых значимых бита (100) не сохраняются, а подразумеваются, как показано выше; а следующий бит всегда равен нулю в допустимых кодировках).

В приведенных выше случаях представленное значение равно

(−1) знак × 10 показатель степени−398 × мантисса

Если четыре бита после знакового бита равны «1111», то значение равно бесконечности или NaN, как описано выше:

0 11110 xx...x +бесконечность1 11110 xx...x -бесконечностьx 11111 0x...xa тихий NaNx 11111 1x...xa сигнализация NaN

Плотно упакованное поле десятичной значащей части

В этой версии мантисса хранится как ряд десятичных цифр. Ведущая цифра находится между 0 и 9 (3 или 4 двоичных бита), а остальная часть мантиссы использует плотно упакованную десятичную кодировку (DPD).

Ведущий2 бита показателя степени и ведущая цифра (3 или4 бита ) мантиссы объединяются в пять бит, следующих за битом знака.

Эти восемь битов после этого представляют собой поле продолжения экспоненты, содержащее младшие биты экспоненты.

Последний50 бит — это поле продолжения значащей части, состоящее из пяти 10-битных децитов . [3] Каждый децит кодирует три десятичные цифры [3] с использованием кодировки DPD.

Если первые два бита после знакового бита равны «00», «01» или «10», то это ведущие биты экспоненты, а три бита «TTT» после них интерпретируются как ведущая десятичная цифра (от 0 до 7):

с 00 ТТТ (00)eeeeeeee (0TTT)[tttttttt][tttttttt][tttttttt][tttttttt][tttttttttt][tttttttttt]с 01 ТТТ (01)eeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]с 10 ТТТ (10)eeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]

Если первые два бита после знакового бита равны «11», то вторые 2 бита являются ведущими битами экспоненты, а следующий бит «T» имеет префикс в виде неявных битов «100» для формирования ведущей десятичной цифры (8 или 9):

с 1100 Т (00)eeeeeeee (100T)[tttttttttt][tttttttt][tttttttt][tttttttttt][tttttttttt]с 1101 Т (01)eeeeeeee (100T)[tttttttttt][tttttttt][tttttttt][tttttttttt][tttttttttt][tttttttttt]с 1110 Т (10)eeeeeeee (100T)[tttttttttt][tttttttt][tttttttt][tttttttttt][tttttttttt][tttttttttt]

Оставшиеся две комбинации (11 110 и 11 111) 5-битного поля после знакового бита используются для представления ±бесконечности и NaN соответственно.

Транскодирование DPD/3BCD для деклетов приведено в следующей таблице. b9...b0 — биты DPD, а d2...d0 — три цифры BCD.

8 десятичных значений, все цифры которых — 8 или 9, имеют по четыре кодировки. Биты, отмеченные x в таблице выше, игнорируются при вводе, но всегда будут 0 в вычисляемых результатах. ( 8 × 3 = 24 нестандартных кодировок заполняют промежуток между 10 3 = 1000 и 2 10 = 1024. )

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

Смотрите также

Ссылки

  1. ^ IEEE Computer Society (29.08.2008). Стандарт IEEE для арифметики с плавающей точкой. IEEE . doi :10.1109/IEEESTD.2008.4610935. ISBN 978-0-7381-5753-5. IEEE Std 754-2008 . Получено 2016-02-08 .
  2. ^ "ISO/IEC/IEEE 60559:2011". 2011. Получено 2016-02-08 . {{cite journal}}: Цитировать журнал требует |journal=( помощь )
  3. ^ аб Мюллер, Жан-Мишель; Бризебар, Николя; де Динешен, Флоран; Жаннерод, Клод-Пьер; Лефевр, Винсент; Мелькионд, Гийом; Револь, Натали ; Стеле, Дэмиен; Торрес, Серж (2010). Справочник по арифметике с плавающей запятой (1-е изд.). Биркхойзер . дои : 10.1007/978-0-8176-4705-6. ISBN 978-0-8176-4704-9. LCCN  2009939668.
  4. ^ Cowlishaw, Michael Frederic (2007-02-13) [2000-10-03]. "A Summary of Densely Packed Decimal encoding". IBM . Архивировано из оригинала 2015-09-24 . Получено 2016-02-07 .