Плотно упакованные десятичные (DPD) и их использование для увеличения разрядности регистров ЭКВМ.

| рубрика «Калькуляторы» | автор AtH
Метки: , ,

Особенность архитектуры отечественных ЭКВМ — регистры стека (X, Y, Z, T и X1) хранят 14 десятичных знаков «мантиссы», а десятичные регистры (R0…R999) — только 12. Применив технологию плотной упаковки десятичных разрядов (DPD) можно сохранять в регистрах все 14 разрядов, размещая их в том же, или меньшем объёме памяти.

Сейчас новосибирские «Электроника МК-152» и «Электроника МК-161» последовательно используют двоично-десятичный код (BCD), в том числе для хранения в регистрах десятичных чисел. Во второй половине XX века двоично-десятичный код действительно широко применяли, например в советских ПМК и ЕС ЭВМ. В упакованном BCD-коде каждая десятичная цифра занимает 4 бита. Для хранения 12 разрядов «мантиссы» в так называемом «внутреннем формате» отведены 12×4=48 бит, то есть 6 байт. Применив более современные достижения компьютерных наук, в эти шесть байт относительно несложно записать не 12, а все 14 разрядов десятичных чисел и даже знак «мантиссы» — сэкономив по байту на каждом десятичном регистре ЭКВМ!

Плотная упаковка основана на том простом факте, что 210=1024 чуть больше 1000. Этот факт позволяет, например, измерять память в килобайтах — в 1 Килобайте 1024 байт, что довольно близко к привычным 1000 граммам в 1 килограмме. Итого для хранения трёх десятичных знаков (чисел от 000 до 999) вполне достаточно 10 бит, хотя в упакованном BCD они займут 3×4=12 бит, на 2 бита больше необходимого.

Революционная технология DPD (впервые опубликована Mike Cowlishaw из IBM в 2002 году, англ.) позволяет упаковать три десятичных знака в 10 бит и распаковать их обратно гораздо быстрее, чем перевод чисел от 0 до 999 в двоичную систему счисления. Плотная упаковка посложнее упакованного BCD, но также не использует умножения и деления, ограничиваясь быстрыми двоичными сдвигами. При плотной упаковке биты трёх BCD-закодированных десятичных цифр хитро перетасовываются, чтобы уложиться в 10 бит после нескольких проверок, помогающих сэкономить память. Подробности, с примерами, см. в английской Википедии, статья «Densely packed decimal» (англ.). Вот снимок основной таблицы этой статьи — слева «плотные» 10 бит DPD (b9…b0), справа старые добрые 3×4=12 бит BCD (тетрады d2, d1 и d0). Если возникнут языковые или другие трудности в понимании этих материалов, можем обсудить тонкости DPD-кода в комментариях.

DPD, англ.

12 десятичных знаков можно разбить на четыре группы по три знака, которые в плотной упаковке займут 4×10=40 бит, то есть 5 байт. Освободившийся шестой байт легко использовать для хранения 2 оставшихся десятичных знаков, пусть даже в BCD. Если же последовательно придерживаться стандарта DPD (при d2=0abc=0000), один бит шестого байта остаётся свободным. Действительно, раз в 7 бит можно записать 27=128 разных состояний, их вполне достаточно для хранения двух разрядов (чисел от 00 до 99). Свободный бит шестого байта можно задействовать, как знаковый — вместо первого из восьми байт «внутреннего формата», высвобождение которого принесёт [экономию в 1000 байт] на тысячу десятичных регистров «Электроники» и позволяет [добавить 9360 записей] (2340 групп) в усовершенствованный «электронный блокнот».

Конечно, это усовершенствование потребует доработки регистров функций. Можно либо документировать изменение «внутреннего формата», либо добавить функции для перевода чисел из нового формата в старый и обратно. Будучи частью международного стандарта ISO/IEC 60559:2020 (и более старого ISO/IEC 60559:2011, англ.), технология DPD не должна иметь ограничений в использовании и сложностей в реализации — было бы у производителя ЭКВМ (кто имеет законный доступ к прошивке) умение и желание улучшать свои не самые дешёвые устройства.