В вычислительных и электронных системах двоично-десятичное число ( BCD ) — это класс двоичных кодировок десятичных чисел, где каждая цифра представлена фиксированным количеством битов , обычно четырьмя или восемью. Иногда для знака или других указаний (например, ошибки или переполнения) используются специальные битовые комбинации .
В байт -ориентированных системах (то есть в большинстве современных компьютеров) термин «неупакованный BCD» [1] обычно подразумевает полный байт для каждой цифры (часто включая знак), тогда как упакованный BCD обычно кодирует две цифры в одном байте, используя преимущества тот факт, что четырех битов достаточно для представления диапазона от 0 до 9. Однако точное четырехбитное кодирование может варьироваться по техническим причинам (например, Excess-3 ).
Десять состояний, представляющих цифру BCD, иногда называют тетрадами [2] [3] ( полубайт , обычно необходимый для их хранения, также известен как тетрада), а неиспользуемые, неважные состояния называются псевдотетрадами (e). s , [4] [5] [6] [7] [8] псевдодесятичные числа [3] или псевдодесятичные цифры . [9] [10] [количество 1]
Основным достоинством BCD по сравнению с двоичными позиционными системами является более точное представление и округление десятичных величин, а также простота преобразования в обычные, удобочитаемые представления. Его основными недостатками являются небольшое увеличение сложности схем, необходимых для реализации базовой арифметики, а также немного меньшая плотность хранения.
BCD использовался во многих ранних десятичных компьютерах и реализован в наборе команд таких машин, как серия IBM System/360 и ее потомки, VAX компании Digital Equipment Corporation , процессоры Burroughs B1700 и Motorola 68000 . BCD сам по себе не так широко используется, как раньше, и недоступен или ограничен в новых наборах команд (например, ARM ; x86 в длинном режиме ). Однако десятичные форматы с фиксированной запятой и десятичные форматы с плавающей запятой по-прежнему важны и продолжают использоваться в финансовых, коммерческих и промышленных вычислениях, где недопустимы тонкие ошибки преобразования и дробного округления , присущие двоичным форматам с плавающей запятой. [11]
BCD использует тот факт, что любое десятичное число может быть представлено четырехбитным шаблоном. Наиболее очевидным способом кодирования цифр является Natural BCD (NBCD), где каждая десятичная цифра представлена соответствующим четырехбитным двоичным значением, как показано в следующей таблице. Это также называется кодировкой «8421».
Эту схему также можно назвать простой двоично-десятичной кодировкой ( SBCD ) или BCD 8421 , и она является наиболее распространенной кодировкой. [12] Другие включают так называемые кодировки «4221» и «7421», названные в честь взвешивания, используемого для битов, и « Excess-3 ». [13] Например, цифра 6 BCD 0110'b
в нотации 8421 находится 1100'b
в 4221 (возможны две кодировки), 0110'b
в 7421, а в Excess-3 это 1001'b
( ).
В следующей таблице представлены десятичные цифры от 0 до 9 в различных системах кодирования BCD. В заголовках « » указывает вес каждого бита. В пятом столбце («BCD 8 4 −2 −1») два веса отрицательны. Также показаны коды символов ASCII и EBCDIC для цифр, которые являются примерами зонального BCD.8 4 2 1
Поскольку большинство компьютеров работают с данными в 8-битных байтах , для кодирования числа BCD можно использовать один из следующих методов:
Например, кодирование десятичного числа 91
с использованием распакованного BCD приводит к следующему двоичному шаблону из двух байтов:
Десятичный: 9 1Двоичный: 0000 1001 0000 0001
В упакованном формате BCD одно и то же число умещается в один байт:
Десятичный: 9 1Двоичный: 1001 0001
Следовательно, числовой диапазон для одного неупакованного байта BCD составляет от нуля до девяти включительно, тогда как диапазон для одного упакованного байта BCD составляет от нуля до девяноста девяти включительно.
Для представления чисел, превышающих диапазон одного байта, может использоваться любое количество смежных байтов. Например, чтобы представить десятичное число 12345
в упакованном BCD формате с обратным порядком байтов , программа будет кодировать следующим образом:
Десятичный: 0 1 2 3 4 5Двоичный: 0000 0001 0010 0011 0100 0101
Здесь самый старший полубайт самого старшего байта закодирован как ноль, поэтому число сохраняется как 012345
(но процедуры форматирования могут заменить или удалить ведущие нули). Упакованный BCD более эффективен в использовании хранилища, чем распакованный BCD; кодирование того же числа (с ведущим нулем) в распакованном формате потребует вдвое больше памяти.
Операции сдвига и маскировки используются для упаковки или распаковки упакованной цифры BCD. Другие побитовые операции используются для преобразования числа в эквивалентный битовый шаблон или обратного процесса.
В упакованном BCD (или просто упакованном десятичном формате [38] ) каждый полубайт представляет десятичную цифру. [nb 8] Упакованный BCD используется по крайней мере с 1960-х годов и с тех пор реализован во всем аппаратном обеспечении мэйнфреймов IBM. Большинство реализаций имеют обратный порядок байтов , т. е. с более старшей цифрой в верхней половине каждого байта, а самый левый байт (находящийся по самому низкому адресу памяти) содержит старшие цифры упакованного десятичного значения. Младший полубайт самого правого байта обычно используется в качестве флага знака, хотя в некоторых беззнаковых представлениях флаг знака отсутствует. Например, 4-байтовое значение состоит из 8 полубайтов, причем старшие 7 полубайтов хранят цифры 7-значного десятичного значения, а самый низкий полубайт указывает знак десятичного целочисленного значения.
Стандартные значения знака: 1100 ( шестнадцатеричный C) для положительного (+) и 1101 (D) для отрицательного (-). Это соглашение исходит из поля зоны для символов EBCDIC и знакового представления дублирования . Другими разрешенными знаками являются 1010 (A) и 1110 (E) для положительного и 1011 (B) для отрицательного. Процессоры IBM System/360 будут использовать знаки 1010 (A) и 1011 (B), если в PSW установлен бит A для стандарта ASCII-8, который так и не прошел проверку. Большинство реализаций также предоставляют беззнаковые значения BCD со знаком 1111 (F). [39] [40] [41] ILE RPG использует 1111 (F) для положительного и 1101 (D) для отрицательного. [42] Они соответствуют зоне EBCDIC для цифр без перечеркивания знака. В упакованном BCD число 127 представлено 0001 0010 0111 1100 (127C), а -127 представлено 0001 0010 0111 1101 (127D). В системах Берроуза для отрицательного знака используется 1101 (D), а любое другое значение считается положительным знаком (процессоры нормализуют положительный знак до 1100 (C)).
Независимо от того, сколько байтов имеет ширина слова , число полубайтов всегда четное, поскольку в каждом байте их два. Следовательно, слово из n байтов может содержать до (2 n )−1 десятичных цифр, что всегда является нечетным числом цифр. Десятичное число с d цифрами требует1/2( d +1) байт памяти.
Например, 4-байтовое (32-битное) слово может содержать семь десятичных цифр плюс знак и представлять значения в диапазоне ±9 999 999. Таким образом, число −1 234 567 имеет ширину 7 цифр и кодируется как:
0001 0010 0011 0100 0101 0110 0111 11011 2 3 4 5 6 7 -
Подобно символьным строкам, первый байт упакованного десятичного числа (с двумя старшими цифрами) обычно хранится по самому младшему адресу в памяти, независимо от порядка байтов машины.
Напротив, 4-байтовое двоичное целое число с дополнением до двух может представлять значения от -2 147 483 648 до +2 147 483 647.
Хотя упакованный BCD не обеспечивает оптимального использования памяти (для хранения тех же чисел используется примерно на 20% больше памяти, чем в двоичной записи ), преобразование в ASCII , EBCDIC или различные кодировки Unicode становится тривиальным, поскольку никаких арифметических операций не требуется. Дополнительные требования к памяти обычно компенсируются необходимостью точности и совместимости с калькулятором или ручными вычислениями, которые обеспечивает десятичная арифметика с фиксированной запятой. Существуют более плотные упаковки BCD , которые позволяют избежать штрафов за хранение, а также не требуют арифметических операций для обычных преобразований.
Упакованный BCD поддерживается в языке программирования COBOL как тип данных «COMPUTATIONAL-3» (расширение IBM, принятое многими другими поставщиками компиляторов) или «PACKED-DECIMAL» (часть стандарта COBOL 1985 года). В PL/I он поддерживается как «FIXED DECIMAL». Помимо IBM System/360 и более поздних совместимых мэйнфреймов, упакованный BCD реализован в собственном наборе команд исходных процессоров VAX от Digital Equipment Corporation и некоторых моделей мэйнфреймов серии SDS Sigma и является собственным форматом для средних систем Burroughs Corporation. линейка мэйнфреймов (происходящая от серии Electrodata 200 1950-х годов).
Представления в виде дополнения до десяти для отрицательных чисел предлагают альтернативный подход к кодированию знака упакованных (и других) чисел BCD. В этом случае положительные числа всегда имеют старшую значащую цифру от 0 до 4 (включительно), а отрицательные числа представлены дополнением до десяти соответствующего положительного числа. В результате эта система позволяет 32-битным упакованным двоично-десятичным числам находиться в диапазоне от -50 000 000 до +49 999 999, а -1 представляется как 99999999. (Как и в случае с двоичными числами с дополнением до двух, диапазон не симметричен относительно нуля.)
Десятичные числа с фиксированной запятой поддерживаются некоторыми языками программирования (например, COBOL и PL/I). Эти языки позволяют программисту указывать неявную десятичную точку перед одной из цифр. Например, упакованное десятичное значение, закодированное байтами 12 34 56 7C, представляет значение с фиксированной точкой +1234,567, когда подразумеваемая десятичная точка расположена между четвертой и пятой цифрами:
12 34 56 7С 12 34,56 7+
Десятичная точка фактически не сохраняется в памяти, поскольку сжатый формат хранения BCD этого не обеспечивает. Его расположение просто известно компилятору, и сгенерированный код действует соответствующим образом для различных арифметических операций.
Если для десятичной цифры требуется четыре бита, то для трех десятичных цифр требуется 12 бит. Однако, поскольку 2 10 (1024) больше, чем 10 3 (1000), если три десятичные цифры закодированы вместе, потребуется только 10 бит. Двумя такими кодировками являются кодировка Чена – Хо и плотно упакованная десятичная дробь (DPD). Последний имеет то преимущество, что подмножества кодировки кодируют две цифры в оптимальных семи битах и одну цифру в четырех битах, как в обычном BCD.
Некоторые реализации, например мэйнфреймы IBM , поддерживают зонированные десятичные числовые представления. Каждая десятичная цифра хранится в одном байте, причем младшие четыре бита кодируют цифру в формате BCD. Старшим четырем битам, называемым битами «зоны», обычно присваивается фиксированное значение, так что байт содержит символьное значение, соответствующее цифре. В системах EBCDIC используется значение зоны 1111 (шестнадцатеричное F); это дает байты в диапазоне от F0 до F9 (шестнадцатеричный), которые являются кодами EBCDIC для символов от «0» до «9». Аналогичным образом, системы ASCII используют значение зоны 0011 (шестнадцатеричное 3), давая коды символов от 30 до 39 (шестнадцатеричное).
Для зонированных десятичных значений со знаком самый правый (наименее значимый) полубайт зоны содержит знаковую цифру, которая представляет собой тот же набор значений, который используется для упакованных десятичных чисел со знаком (см. выше). Таким образом, зонированное десятичное значение, закодированное в виде шестнадцатеричных байтов F1 F2 D3, представляет десятичное значение со знаком -123:
Ф1 Ф2 Д31 2 −3
(*) Примечание. Эти символы различаются в зависимости от настроек местной кодовой страницы .
Некоторые языки (например, COBOL и PL/I) напрямую поддерживают зонированные десятичные значения с фиксированной запятой, присваивая неявную десятичную точку в некотором месте между десятичными цифрами числа. Например, для шестибайтового зонированного десятичного значения со знаком и подразумеваемой десятичной точкой справа от четвертой цифры шестнадцатеричные байты F1 F2 F7 F9 F5 C0 представляют значение +1279,50:
F1 F2 F7 F9 F5 C01 2 7 9. 5 +0
IBM использовала термины «двоично-десятичный код обмена» (BCDIC, иногда просто BCD) для 6-битных буквенно-цифровых кодов, которые представляли числа, буквы в верхнем регистре и специальные символы. Некоторые варианты буквенно-цифровых символов BCDIC используются в большинстве ранних компьютеров IBM, включая IBM 1620 (представленный в 1959 году), серию IBM 1400 и члены серии IBM 700/7000 с недесятичной архитектурой .
Серия IBM 1400 представляет собой машины с посимвольной адресацией, каждая позиция которых состоит из шести битов, помеченных B, A, 8, 4, 2 и 1, плюс бит проверки нечетности ( C ) и бит словесной метки ( M ). Для кодирования цифр от 1 до 9 B и A равны нулю, а значение цифры представлено стандартным 4-битным BCD в битах с 8 по 1 . Для большинства других символов биты B и A получаются просто из «зонных номеров» «12», «11» и «0» в коде символов перфокарты , а биты с 8 по 1 — из номеров с 1 по 9 . Удар «12 зон» устанавливает как B, так и A , «11 зон» устанавливает B , а «0 зона» (удар 0 в сочетании с любыми другими) устанавливает A . Таким образом, буква A , которая в формате перфокарты равна (12,1) , кодируется (B,A,1) . Символ валюты $ , (11,8,3) на перфокарте был закодирован в памяти как (B,8,2,1) . Это позволяет схеме очень просто конвертировать формат перфокарты в формат внутренней памяти, за исключением нескольких особых случаев. Одним из важных особых случаев является цифра 0 , представленная одиночной цифрой 0 на карте и (8,2) в основной памяти. [43]
Память IBM 1620 организована в 6-битные адресуемые цифры: обычные 8, 4, 2, 1 плюс F , используемые в качестве бита флага, и C , бит проверки нечетности. Буквенные символы BCD кодируются с использованием пар цифр, при этом «зона» находится в цифре с четным адресом, а «цифра» - в цифре с нечетным адресом, причем «зона» связана с « зонными ударами» 12 , 11 и 0 как в серии 1400. Аппаратное преобразование ввода/вывода преобразует внутренние пары цифр во внешние стандартные 6-битные двоично-десятичные коды.
В десятичной архитектуре IBM 7070 , IBM 7072 и IBM 7074 буквенные символы кодируются с использованием пар цифр (с использованием кода два из пяти в цифрах, а не BCD) 10-значного слова с «зоной» в левая цифра и «цифра» в правой цифре. Аппаратное преобразование ввода/вывода преобразует внутренние пары цифр во внешние стандартные 6-битные двоично-десятичные коды.
С появлением System/360 компания IBM расширила 6-битный алфавитный код BCD до 8-битного EBCDIC, что позволило добавлять гораздо больше символов (например, строчные буквы). Также реализован числовой тип данных Packed BCD переменной длины , предоставляющий машинные инструкции, которые выполняют арифметические действия непосредственно с упакованными десятичными данными.
На IBM 1130 и 1800 упакованный BCD поддерживается программным обеспечением IBM Commercial Subroutine Package.
Сегодня данные BCD по-прежнему широко используются в базах данных IBM, таких как IBM Db2 , и процессорах, таких как z/Architecture и POWER6 и более поздних процессорах Power ISA . В этих продуктах BCD обычно представляет собой зональное BCD (как в EBCDIC или ASCII), упакованное BCD (две десятичные цифры на байт) или «чистое» кодирование BCD (одна десятичная цифра хранится как BCD в младших четырех битах каждого байта). . Все они используются в аппаратных регистрах и процессорах, а также в программном обеспечении. Чтобы преобразовать упакованные десятичные дроби в выгрузках таблицы EBCDIC в читаемые числа, вы можете использовать маску OUTREC FIELDS утилиты JCL DFSORT. [44]
Серия VAX компании Digital Equipment Corporation включает инструкции , которые могут выполнять арифметические действия непосредственно с упакованными данными BCD и преобразовывать упакованные данные BCD в другие целочисленные представления. [41] Упакованный формат BCD VAX совместим с форматом IBM System/360 и более поздних совместимых процессоров IBM. В MicroVAX и более поздних реализациях VAX эта возможность была исключена из ЦП, но сохранена совместимость кода с более ранними машинами за счет реализации недостающих инструкций в библиотеке программного обеспечения, поставляемой операционной системой. Это вызывается автоматически посредством обработки исключений при обнаружении несуществующих инструкций, так что программы, использующие их, могут выполняться без изменений на новых машинах.
Архитектура Intel x86 поддерживает уникальный 18-значный (десятибайтовый) формат BCD , который можно загружать и сохранять из регистров с плавающей запятой, откуда можно выполнять вычисления. [45]
Серия Motorola 68000 имела инструкции BCD. [46]
В более поздних компьютерах такие возможности почти всегда реализованы в программном обеспечении, а не в наборе инструкций ЦП, но числовые данные в формате BCD по-прежнему чрезвычайно распространены в коммерческих и финансовых приложениях. Существуют приемы реализации упакованных BCD и зонированных десятичных операций сложения и вычитания с использованием коротких, но трудных для понимания последовательностей параллельной логики и операций двоичной арифметики. [47] Например, следующий код (написанный на C ) вычисляет беззнаковое сложение 8-значного упакованного BCD с использованием 32-битных двоичных операций:
uint32_t BCDadd ( uint32_t a , uint32_t b ) { uint32_t t1 , t2 ; // беззнаковые 32-битные промежуточные значения т1 = а + 0x06666666 ; т2 = т1 ^ б ; // сумма без переноса t1 = t1 + b ; // предварительная сумма t2 = t1 ^ t2 ; // все двоичные биты переноса t2 = ~ t2 & 0x11111110 ; // только биты в формате BCD t2 = ( t2 >> 2 ) | ( т2 >> 3 ); // возврат коррекции t1 - t2 ; // исправленная сумма в формате BCD }
BCD очень распространен в электронных системах, где должно отображаться числовое значение, особенно в системах, состоящих исключительно из цифровой логики и не содержащих микропроцессор. Используя BCD, манипулирование числовыми данными для отображения можно значительно упростить, рассматривая каждую цифру как отдельную подсхему. Это гораздо лучше соответствует физической реальности аппаратного обеспечения дисплея — например, разработчик может использовать серию отдельных идентичных семисегментных дисплеев для построения схемы измерения. Если бы числовая величина хранилась и обрабатывалась в чисто двоичном виде, для взаимодействия с таким дисплеем потребовалась бы сложная схема. Следовательно, в тех случаях, когда вычисления относительно просты, работа с BCD может привести к созданию в целом более простой системы, чем преобразование в двоичный формат и из него. Большинство карманных калькуляторов выполняют все расчеты в формате BCD.
Тот же аргумент применим, когда оборудование этого типа использует встроенный микроконтроллер или другой небольшой процессор. Часто внутреннее представление чисел в формате BCD приводит к уменьшению размера кода, поскольку преобразование из или в двоичное представление может быть дорогостоящим на таких ограниченных процессорах. Для этих приложений некоторые небольшие процессоры имеют специальные арифметические режимы, которые помогают при написании процедур, управляющих величинами BCD. [48] [49]
Можно выполнить сложение , сначала сложив двоичный код, а затем преобразуя его в BCD. Преобразование простой суммы двух цифр можно выполнить путем сложения 6 (то есть 16–10), когда пятибитный результат сложения пары цифр имеет значение больше 9. Причина сложения 6 заключается в том, что существуют 16 возможных 4-битных значений BCD (поскольку 2 4 = 16), но действительны только 10 значений (от 0000 до 1001). Например:
1001 + 1000 = 10001 9 + 8 = 17
10001 — это двоичное, а не десятичное представление желаемого результата, но старшая 1 («перенос») не может поместиться в 4-битное двоичное число. В BCD, как и в десятичном формате, не может существовать значение, превышающее 9 (1001) на цифру. Чтобы исправить это, к сумме добавляется 6 (0110), а затем результат обрабатывается как два полубайта:
10001 + 0110 = 00010111 => 0001 0111 17 + 6 = 23 1 7
Два полубайта результата, 0001 и 0111, соответствуют цифрам «1» и «7». Это дает «17» в BCD, что является правильным результатом.
Этот метод можно расширить до добавления нескольких цифр путем добавления групп справа налево, распространения второй цифры как переноса, всегда сравнивая 5-битный результат суммы каждой пары цифр с 9. Некоторые процессоры предоставляют флаг полупереноса . для облегчения корректировок арифметики BCD после двоичных операций сложения и вычитания. Intel 8080 , Zilog Z80 [50] и процессоры семейства x86 [51] предоставляют код операции DAA (Decimal Adjust Accumulator).
Вычитание осуществляется путем прибавления десятичных чисел вычитаемого к вычитаемому . Чтобы представить знак числа в BCD, число 0000 используется для обозначения положительного числа , а 1001 используется для обозначения отрицательного числа . Остальные 14 комбинаций являются недействительными знаками. Чтобы проиллюстрировать вычитание знаков в формате BCD, рассмотрим следующую задачу: 357 – 432.
В формате BCD число 357 равно 0000 0011 0101 0111. Десятичное число 432 можно получить, взяв девятикратное число 432 и прибавив единицу. Итак, 999–432 = 567 и 567 + 1 = 568. Если перед 568 в BCD поставить отрицательный знак, можно представить число –432. Итак, -432 в формате BCD равно 1001 0101 0110 1000.
Теперь, когда оба числа представлены в формате BCD, их можно сложить:
0000 0011 0101 0111 0 3 5 7+ 1001 0101 0110 1000 9 5 6 8= 1001 1000 1011 1111 9 8 11 15
Поскольку BCD — это форма десятичного представления, некоторые из приведенных выше сумм цифр недействительны. В случае существования недопустимой записи (любая цифра BCD больше 1001) к ней добавляется 6, чтобы сгенерировать бит переноса и сделать сумму допустимой записью. Таким образом, добавление 6 к недопустимым записям приводит к следующему:
1001 1000 1011 1111 9 8 11 15+ 0000 0000 0110 0110 0 0 6 6= 1001 1001 0010 0101 9 9 2 5
Таким образом, результат вычитания равен 1001 1001 0010 0101 (-925). Для подтверждения результата обратите внимание, что первая цифра — 9, что означает отрицательный результат. Кажется, это правильно, поскольку 357–432 должно давать отрицательное число. Остальные полубайты имеют формат BCD, поэтому 1001 0010 0101 равно 925. Десятичное дополнение 925 равно 1000 − 925 = 75, поэтому вычисленный ответ равен −75.
Если складывается разное количество полубайтов (например, 1053 - 2), перед числом с меньшим количеством цифр необходимо сначала поставить нули, прежде чем выполнять дополнение или вычитание до десяти. Таким образом, при 1053 - 2 сначала нужно будет представить 2 как 0002 в двоично-десятичном формате и вычислить десятичное дополнение 0002.
Существуют различные реализации BCD, в которых используются другие представления чисел. Программируемые калькуляторы, производимые Texas Instruments , Hewlett-Packard и другими, обычно используют формат BCD с плавающей запятой , обычно с двумя или тремя цифрами для (десятичного) показателя степени. Дополнительные биты знаковой цифры могут использоваться для обозначения специальных числовых значений, таких как бесконечность , нижнее / переполнение и ошибка (мигающий дисплей).
Десятичные значения со знаком могут быть представлены несколькими способами. Например, язык программирования COBOL поддерживает пять зональных десятичных форматов, каждый из которых кодирует числовой знак по- своему :
3GPP разработала TBCD , [53] расширение BCD, в котором оставшиеся (неиспользуемые) битовые комбинации используются для добавления определенных телефонных символов, [54] [55] с цифрами, аналогичными тем, которые встречаются в оригинальной конструкции телефонных клавиатур .
Упомянутый документ 3GPP определяет TBCD-STRING с переставленными местами полубайтами в каждом байте. Биты, октеты и цифры индексируются с 1, биты справа, цифры и октеты слева.
биты 8765 октета n, кодирующие цифру 2 n
биты 4321 октета n , кодирующие цифру 2( n – 1) + 1
Значение числа 1234
станет 21 43
в TBCD.
Если ошибки в представлении и вычислениях более важны, чем скорость преобразования в отображение и обратно, можно использовать масштабированное двоичное представление, в котором десятичное число хранится как целое число в двоичном кодировании и десятичный показатель степени со знаком в двоичном кодировании. Например, 0,2 можно представить как 2 × 10 .−1 .
Это представление позволяет быстро умножать и делить, но может потребоваться сдвиг в 10-й степени во время сложения и вычитания для выравнивания десятичных точек. Это подходит для приложений с фиксированным количеством десятичных знаков, которые не требуют такой корректировки, особенно для финансовых приложений, где обычно достаточно 2 или 4 цифр после запятой. Действительно, это почти форма арифметики с фиксированной точкой , поскольку подразумевается положение точки счисления .
Кодировки Герца и Чена-Хо обеспечивают логические преобразования для преобразования групп из трех цифр в двоично-десятичном коде в 10-битные значения и обратно [ nb 1] , которые могут быть эффективно закодированы аппаратно с задержкой всего в 2 или 3 вентиля. Плотно упакованная десятичная дробь (DPD) — это аналогичная схема [nb 1] , которая используется для большей части мантиссы , за исключением первой цифры, для одной из двух альтернативных десятичных кодировок, указанных в стандарте IEEE 754-2008 с плавающей запятой.
BIOS многих персональных компьютеров хранит дату и время в формате BCD, поскольку чип часов реального времени MC6818 , использованный в исходной материнской плате IBM PC AT, предоставлял время, закодированное в BCD. Эта форма легко преобразуется в ASCII для отображения. [56] [57]
Семейство 8-битных компьютеров Atari использовало BCD для реализации алгоритмов с плавающей запятой. Процессор MOS 6502 имеет режим BCD, который влияет на инструкции сложения и вычитания. Программное обеспечение карманного компьютера Psion Organizer 1, поставляемое производителем, также полностью использовало BCD для реализации операций с плавающей запятой; более поздние модели Psion использовали исключительно двоичный код.
Ранние модели PlayStation 3 хранят дату и время в формате BCD. Это привело к отключению консоли по всему миру 1 марта 2010 года. Последние две цифры года, сохраненные в формате BCD, были ошибочно интерпретированы как 16, что привело к ошибке в дате устройства, что сделало большинство функций неработоспособными. Эту проблему называют проблемой 2010 года .
В деле 1972 года Готшальк против Бенсона Верховный суд США отменил решение суда низшей инстанции , разрешившее патент на преобразование чисел в двоично-десятичном коде в двоичные на компьютере. В решении отмечалось, что патент «полностью предвосхитит математическую формулу и на практике будет патентом на сам алгоритм ». [58] Это было знаковое решение, определившее патентоспособность программного обеспечения и алгоритмов .
[…] Die nicht erlaubten 0/1-Muster nennt man auch Pseudodezimalen. […](320 страниц)
[…] Последний столбец [Таблицы II], помеченный как «Наилучший», дает максимально возможную долю для любого кода, а именно 0,60, что вдвое лучше, чем у любого обычного кода. Эта экстремаль достигается с помощью десяти [жёстко отмеченных вершин графа рис. 4 для n = 4, или, фактически, с любым набором из десяти кодовых комбинаций, включающим все восемь с четным (или все восемь с нечетным числом). ) количество «1». Во второй и третьей строках таблицы II указаны среднее и максимальное изменение десятичной дроби на необнаруженную одиночную двоичную ошибку, и они были получены с использованием уравнений разд. II для Δ
1
и δ
1
. Индекс путаницы десятичных дробей по критерию «изменения десятичной дроби» принимается равным c
ij
= |i − j| i,j = 0, 1, … 9. Опять же, «Наилучшее» возможное расположение (одинаково для среднего и пикового значения), одно из которых показано на рис. 4, существенно лучше, чем традиционные коды. […] Рис. 4. Код минимальной путаницы для десятичных дробей. […] δ
1
=2 Δ
1
=15 […]
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] (11 страниц) (NB. Кроме комбинаторного набора 4-битных BCD " коды с минимальной путаницей для десятичных чисел», из которых автор явно иллюстрирует только один (здесь воспроизведенный как код I) в виде 4-битного графика, автор также показывает 4-битный «двоичный код для аналоговых данных» с 16 состояниями. в виде кодовой таблицы, которая, однако, здесь не обсуждается. Показанный здесь код II представляет собой модификацию кода, который я обсуждал Бергером.)
[…] Циклический код выгоден главным образом при использовании релейных схем, поскольку тогда липкое реле не будет выдавать ложное состояние, поскольку оно задерживается при переходе от одного циклического числа к другому. Есть много других циклических кодов, обладающих этим свойством. […][12] (xxiv+835+1 стр.) (Примечание: Ледли классифицировал описанный циклический код как циклический двоичный код с десятичной кодировкой .)
[…] При работе с целыми числами BCD в
регистрах общего назначения
значения BCD могут быть распакованы (одна цифра BCD на байт) или упакованы (две цифры BCD на байт). Значение распакованного целого числа BCD — это двоичное значение младшего
полубайта
(биты от 0 до 3). Старший полубайт (биты с 4 по 7) может иметь любое значение во время сложения и вычитания, но должен быть равен нулю во время умножения и деления. Упакованные целые числа BCD позволяют содержать две цифры BCD в одном байте. Здесь цифра в старшем полубайте более значима, чем цифра в младшем полубайте. […] При работе с целыми числами BCD в регистрах данных
FPU
x87
значения BCD упаковываются в 80-битный формат и называются десятичными целыми числами. В этом формате первые 9 байтов содержат 18 цифр BCD, по 2 цифры на байт. Младшая
цифра
содержится в нижнем полубайте байта 0, а самая
старшая цифра
содержится в верхнем полубайте байта 9. Самый старший бит байта 10 содержит
знаковый бит
(0 = положительный и 1 = отрицательно; биты с 0 по 6 байта 10 являются
неважными
битами). Отрицательные десятичные целые числа не сохраняются в форме
дополнения до двух
; они отличаются от положительных десятичных целых чисел только знаковым битом. Диапазон десятичных целых чисел, которые можно закодировать в этом формате, составляет от -10
18
+ 1 до 10
18
- 1. Формат десятичных целых чисел существует только в памяти. Когда десятичное целое число загружается в регистр данных x87 FPU, оно автоматически преобразуется в
формат с плавающей запятой двойной расширенной точности
. Все десятичные целые числа точно представимы в формате двойной повышенной точности. […]
[13]