Плотно упакованный десятичный код, (), DPD — эффективный метод двоичного кодирования десятичных цифр определённый разделом 3.5.2 ISO/IEC 60559. Аббревиатура DPD часто применяется (Fujitsu, GNU, IBM и другими) для обозначения одного из способов кодирования десятичных чисел с плавающей запятой.

Традиционная система двоичного кодирования десятичных цифр, известная как двоично-десятичное кодирование BCD, использует четыре бита для кодирования каждой цифры, что приводит к значительным потерям (поскольку четыре бита могут хранить 16 состояний, а используются только 10). DPD — это более эффективный код, который упаковывает три цифры в десять бит.

DPD является модификацией , особое расположение бит обеспечивает:

Код чисел с одной или двумя ненулевыми младшими цифрами содержит не более четырех или семи ненулевых младших бит; DPD код для чисел от 0 до 79 совпадает с их BCD кодом; Младший бит каждой цифры копируется без изменений. Таким образом, нетривиальную часть кодирования можно рассматривать как преобразование трех цифр в пятеричной системе счисления в семь двоичных битов.

История В 1969 году — Теодор М. Герц, а в 1971 году — Тянь Чи Чен () с Ирвингом Цзе Хо () разработали префиксные коды без потерь (называемые кодами Герца и Чен-Хо), которые кодировали три десятичных разряда в десять двоичных бит, используя схему, которая позволяла аппаратно кодировать или декодировать данные BCD с двумя-тремя . DPD, разработанным Майком Ф. Коулишоу в 2002 году, был включен в стандарты IEEE 754-2008 и ISO/IEC/IEEE 60559:2011 как один из способов кодирования десятичных чисел с плавающей запятой.

Кодирование Подобно кодированию Чен-Хо, кодирование DPD классифицирует каждую десятичную цифру в один из двух диапазонов в зависимости от старшего бита BCD: «малые» цифры имеют значения от 0 до 7 (двоичные 0000–0111), а «большие» цифры — от 8 до 9 (двоичные 1000–1001). При кодировании старшие биты d(1,0), d(2,0), d(3,0) каждой из трех кодируемых цифр d(1), d(2), d(3) определяют один из восьми шаблонов кодирования для оставшихся бит в соответствии со следующей таблицей. d(1,0), d(2,0), d(3,0)b(0), b(1), b(2)b(3), b(4), b(5)b(6)b(7), b(8), b(9)0 0 0d(1,1:3)d(2,1:3)0d(3,1:3)0 0 1d(1,1:3)d(2,1:3)10, 0, d(3,3)0 1 0d(1,1:3)d(3,1:2), d(2,3)10, 1, d(3,3)0 1 1d(1,1:3)1, 0, d(2,3)11, 1, d(3,3)1 0 0d(3,1:2), d(1,3)d(2,1:3)11, 0, d(3,3)1 0 1d(2,1:2), d(1,3)0, 1, d(2,3)11, 1, d(3,3)1 1 0d(3,1:2), d(1,3)0, 0, d(2,3)11, 1, d(3,3)1 1 10, 0, d(1,3)1, 1, d(2,3)11, 1, d(3,3)

Декодирование Деклет b(0:9) декодируется в 3 десятичных знака d(1), d(2), d(3) согласно нижеследующей таблицы. Первый столбец представлен в двоичном формате, где "x" обозначает произвольный бит. Таким образом, все 1024 возможных деклета должны быть приняты и преобразованы в 1000 возможных 3-разрядных чисел с некоторой избыточностью. b(6), b(7), b(8), b(3), b(4)d(1)d(2)d(3)0 x x x x4b(0) + 2b(1) + b(2)4b(3) + 2b(4) + b(5)4b(7) + 2b(8) + b(9)1 0 0 x x4b(0) + 2b(1) + b(2)4b(3) + 2b(4) + b(5)8 + b(9)1 0 1 x x4b(0) + 2b(1) + b(2)8 + b(5)4b(3) + 2b(4) + b(9)1 1 0 x x8 + b(2)4b(3) + 2b(4) + b(5)4b(0) + 2b(1) + b(9)1 1 1 0 08 + b(2)8 + b(5)4b(0) + 2b(1) + b(9)1 1 1 0 18 + b(2)4b(0) + 2b(1) + b(5)8 + b(9)1 1 1 1 04b(0) + 2b(1) + b(2)8 + b(5)8 + b(9)1 1 1 1 18 + b(2)8 + b(5)8 + b(9) Декодирование 24 неканонических деклетов вида 01x11x111x, 10x11x111x или 11x11x111x (где "x" обозначает произвольный бит), которые не могут быть результатом кодирования DPD, соответствует некоторым значениям в диапазоне от 0 до 999. В стандарте ISO/IEC 60559 есть оговорка, что такого рода декодирование может возникать при обработке NaN.

Примеры В этой таблице представлены примеры десятичных чисел и их BCD и DPD кодов: Десятичное числоd(1), d(2), d(3) BCD DPDb(0:9) 000 0000 0000 0000 000 000 0000 005 0000 0000 0101 000 000 0101 009 0000 0000 1001 000 000 1001 017 0000 0001 0111 000 001 0111 079 0000 0111 1001 000 111 1001 080 0000 1000 0000 000 000 1010 099 0000 1001 1001 000 101 1111 542 0101 0100 0010 101 100 0010 999 1001 1001 1001 001 111 1111

Аппаратная реализация Как кодирование, так и декодирование могут быть выполнены с помощью довольно простой логической схемы. Поскольку это простая схема без обратных связей, её скорость может быть весьма высока. Кодирование: b(0) = d(1,0)&d(2,1)&d(3,0) | d(1,0)&d(3,1) | d(1,1) b(1) = d(1,0)&d(2,2)&d(3,0) | d(1,0)&d(3,2) | d(1,2) b(2) = d(1,3) b(3) = ~d(1,0)&d(2,0)&d(3,1) | d(2,1)&~d(3,0) | ~d(1,0)&d(2,1) | d(2,0)&d(3,0) b(4) = ~d(1,0)&d(2,0)&d(3,2) | d(1,0)&d(3,0) | d(2,2) b(5) = d(2,3) b(6) = d(1,0) | d(2,0) | d(3,0) b(7) = ~d(2,0)&d(3,1) | d(2,0)&d(3,0) | d(1,0) b(8) = ~d(1,0)&d(3,2) | d(1,0)&d(3,0) | d(2,0) b(9) = d(3,3)

Декодирование: d(1,0) = ~b(3)&b(6)&b(7) | b(4)&b(6)&b(7)&b(8) | b(6)&b(7)&~b(8) d(1,1) = b(0)&b(3)&b(8)&~b(4) | b(0)&~b(7) | b(0)&~b(6) d(1,2) = b(1)&b(3)&b(8)&~b(4) | b(1)&~b(7) | b(1)&~b(6) d(1,3) = b(2) d(2,0) = b(4)&b(6)&~b(7)&b(8) | b(3)&b(6)&b(7)&b(8) | ~b(4)&b(6)&b(8) d(2,1) = b(0)&b(4)&b(6)&b(7)&b(8)&~b(3) | b(3)&~b(8) | b(3)&~b(6) d(2,2) = b(1)&b(4)&b(7)&~b(3) | b(4)&~b(8) | b(4)&~b(6) d(2,3) = b(5) d(3,0) = b(4)&b(6)&b(7)&b(8) | b(3)&b(6)&b(7)&b(8) | b(6)&~b(7)&~b(8) d(3,1) = b(0)&~b(3)&~b(4)&b(7) | b(3)&b(6)&~b(7)&b(8) | b(0)&b(7)&~b(8) | ~b(6)&b(7) d(3,2) = b(1)&~b(3)&~b(4)&b(6)&b(7) | b(1)&b(6)&b(7)&~b(8) | b(4)&b(6)&~b(7)&b(8) | ~b(6)&b(8) d(3,3) = b(9)

См. также Двоично-десятичный код (BCD) Десятичное кодирование десятичных чисел с плавающей точкой (DPD) Формат decimal32 Формат decimal64 Формат decimal128 QR-код

Ссылки

Дополнительная информация and (NB. This patent is about DPD.)

Категория:Двоичная арифметика Категория:Десятичная система счисления