В вычислительной технике 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, если включены оба знаковых нуля , в двух разных когортах).
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) не сохраняются, а подразумеваются, как показано выше; а следующий бит всегда равен нулю в допустимых кодировках).
В приведенных выше случаях представленное значение равно
Если четыре бита после знакового бита равны «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. )
В приведенных выше случаях, если истинная значимая часть представляет собой последовательность декодированных десятичных цифр, то представленное значение равно
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь )