Формат Decimal128 с плавающей запятой - Decimal128 floating-point format

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

Decimal128 поддерживает 34 десятичные цифры из значимое и показатель степени диапазон от −6143 до +6144, т. е. ±0.000000000000000000000000000000000×10^−6143 к ±9.999999999999999999999999999999999×10^6144. (Эквивалентно, ±0000000000000000000000000000000000×10^−6176 к ±9999999999999999999999999999999999×10^6111.) Следовательно, у decimal128 самый большой диапазон значений по сравнению с другими базовыми форматами с плавающей запятой IEEE. Поскольку мантисса не нормализована, большинство значений меньше 34 значащие цифры иметь несколько возможных представлений; 1 × 102=0.1 × 103=0.01 × 104и т.д. Zero имеет 12288 возможные представления (24576 если оба подписанные нули включены).

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

Представление десятичных128 значений

ЗнакКомбинацияЗначимое и продолжение
1 бит17 бит110 бит
sммммммммммммммммcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

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

В одном методе представления, основанном на двоичное целое десятичное (BID) мантисса представлена ​​как положительное целое число в двоичной кодировке.

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

Обе альтернативы обеспечивают точно такой же диапазон представимых чисел: 34 значащих цифры и 3 × 2.12 = 12288 возможные значения экспоненты.

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

Комбинированное полеЭкспонентаЗначимость MsbitsДругой
00мммммммммммммм00xxxxxxxxxxxx0ccc
01ммммммммммммммм01xxxxxxxxxxxx0ccc
10мммммммммммммм10xxxxxxxxxxxx0ccc
1100мммммммммммм00xxxxxxxxxxxx100c
1101мммммммммммм01xxxxxxxxxxxx100c
1110мммммммммммм10xxxxxxxxxxxx100c
11110мммммммммм± бесконечность
11111ммммммммммммNaN. Знаковый бит игнорируется. Шестой бит поля комбинации определяет, сигнализирует ли NaN.

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

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

В этом формате используется двоичное значение от 0 до 10.34 − 1 = 9999999999999999999999999999999999 = 1ED09BEAD87C0378D8E63FFFFFFFF16 = 0111101101000010011011111010101101100001111100000000110111100011011000111001100011111111111111111111111111111111112Кодирование может представлять двоичные значения до 10 × 2.110 − 1 = 12980742146337069071326240823050239 но значения больше 1034 -1 являются недопустимыми (и стандарт требует, чтобы реализации обрабатывали их как 0, если они встречаются на входе).

Как описано выше, кодирование варьируется в зависимости от того, находятся ли наиболее значимые 4 бита значения в диапазоне от 0 до 7 (00002 к 01112) или выше (10002 или 10012).

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

 s 00eeeeeeeeeeee (0) ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 01eeeeeeeeeeee (0) ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 10eeeeeeeeeeee (0) ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt

Это включает в себя субнормальные числа где первая цифра мантиссы равна 0.

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

 s 1100eeeeeeeeeeee (100) t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 1101eeeeeeeeeeee (100) t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 1110eeeeeeeeeeee (100) t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt

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

Для формата decimal128 все эти значения находятся вне допустимого диапазона (они начинаются с 2113 > 1.038 × 1034), и поэтому декодируются как ноль, но шаблон такой же, как десятичный32 и десятичный64.

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

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

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

s 11110 xx ... x ± бесконечность 11111 0x ... x тихий NaN 11111 1x ... x сигнальный NaN

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

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

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

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

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

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

 s 00 TTT (00) eeeeeeeeeeee (0TTT) [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [ttttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [ttttttttttt] s 01 TTT (01) eeeeeeeeeeee (0TTT) [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [ttttttttttt] s 10 TTT (10) eeeeeeeeeeee (0TTT) [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [ttt

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

 с 1100 T (00) eeeeeeeeeeee (100T) [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] s 1101 T (01) eeeeeeeeeeee (100T) [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] s 1110 T (10) eeeeeeeeeeee (100T) [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt] [tttttttttt]

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

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

Плотно упакованные правила десятичного кодирования[4]
Кодированное значение DPDДесятичные цифры
Кодовое пространство (1024 состояния)b9b8b7b6b5b4b3Би 2b1b0d2d1d0Закодированные значенияОписаниеВхождения (1000 состояний)
50,0% (512 штатов)абcdеж0граммчася0abc0def0Гхи(0–7) (0–7) (0–7)Три маленькие цифры51,2% (512 штатов)
37,5% (384 государства)абcdеж100я0abc0def100я(0–7) (0–7) (8–9)Две маленькие цифры,
один большой
38,4% (384 государства)
абcграммчасж101я0abc100ж0Гхи(0–7) (8–9) (0–7)
граммчасcdеж110я100c0def0Гхи(8–9) (0–7) (0–7)
9,375% (96 штатов)граммчасc00ж111я100c100ж0Гхи(8–9) (8–9) (0–7)Одна маленькая цифра,
два больших
9,6% (96 штатов)
dеc01ж111я100c0def100я(8–9) (0–7) (8–9)
абc10ж111я0abc100ж100я(0–7) (8–9) (8–9)
3,125% (32 штата, 8 использовано)ИксИксc11ж111я100c100ж100я(8–9) (8–9) (8–9)Три большие цифры, биты b9 и b8 - это все равно0,8% (8 штатов)

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

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

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

Рекомендации

  1. ^ IEEE Computer Society (29 августа 2008 г.). Стандарт IEEE для арифметики с плавающей запятой. IEEE. Дои:10.1109 / IEEESTD.2008.4610935. ISBN  978-0-7381-5753-5. IEEE Std 754-2008.
  2. ^ «ISO / IEC / IEEE 60559: 2011». 2011. Получено 2016-02-08. Цитировать журнал требует | журнал = (помощь)
  3. ^ а б Мюллер, Жан-Мишель; Брисебар, Николас; де Динешен, Флоран; Жаннерод, Клод-Пьер; Лефевр, Винсент; Мелькионд, Гийом; Revol, Натали; Stehlé, Damien; Торрес, Серж (2010). Справочник по арифметике с плавающей точкой (1-е изд.). Биркхойзер. Дои:10.1007/978-0-8176-4705-6. ISBN  978-0-8176-4704-9. LCCN  2009939668.
  4. ^ Коулишоу, Майкл Фредерик (2007-02-13) [2000-10-03]. "Краткое описание плотно упакованного десятичного кодирования". IBM. В архиве из оригинала от 24.09.2015. Получено 2016-02-07.