В вычислительных и электронных системах двоично-десятичное кодирование ( BCD ) — это класс двоичных кодировок десятичных чисел, где каждая цифра представлена фиксированным числом битов , обычно четырьмя или восемью. Иногда для знака или других указаний (например, ошибка или переполнение) используются специальные битовые шаблоны .
В байт -ориентированных системах (т. е. в большинстве современных компьютеров) термин « распакованный BCD» [1] обычно подразумевает полный байт для каждой цифры (часто включая знак), тогда как упакованный BCD обычно кодирует две цифры в одном байте, используя тот факт, что четырех бит достаточно для представления диапазона от 0 до 9. Однако точное четырехбитное кодирование может отличаться по техническим причинам (например, Excess-3 ).
Десять состояний, представляющих цифру BCD, иногда называются тетрадами [2] [3] ( полубайт , обычно необходимый для их хранения, также известен как тетрада), в то время как неиспользуемые, не имеющие значения состояния называются псевдотетрадами [ , [4] [5] [6] [7] [8] псевдодесятичными числами [3] или псевдодесятичными цифрами . [9] [10] [nb 1]
Главным достоинством BCD, по сравнению с двоичными позиционными системами , является более точное представление и округление десятичных величин, а также простота преобразования в обычные, понятные человеку представления. Его основными недостатками являются небольшое увеличение сложности схем, необходимых для реализации базовой арифметики, а также немного менее плотное хранение.
BCD использовался во многих ранних десятичных компьютерах и реализован в наборе инструкций таких машин, как серия IBM System/360 и ее потомки, процессоры VAX корпорации Digital Equipment , Burroughs B1700 и серии Motorola 68000 .
BCD как таковой не так широко используется, как в прошлом, и недоступен или ограничен в новых наборах инструкций (например, ARM ; x86 в длинном режиме ). Однако десятичные форматы с фиксированной точкой и десятичные форматы с плавающей точкой по-прежнему важны и продолжают использоваться в финансовых, коммерческих и промышленных вычислениях, где неуловимые ошибки преобразования и дробного округления , присущие двоичным форматам с плавающей точкой, не могут быть допущены. [11]
BCD использует тот факт, что любая десятичная цифра может быть представлена четырехбитным шаблоном. Очевидным способом кодирования цифр является Natural BCD (NBCD), где каждая десятичная цифра представлена соответствующим ей четырехбитным двоичным значением, как показано в следующей таблице. Это также называется кодированием "8421".
Эту схему также можно назвать простой двоично-десятичной системой ( SBCD ) или BCD 8421 , и она является наиболее распространенной кодировкой. [12] Другие включают так называемые кодировки «4221» и «7421» — названные в честь веса, используемого для битов — и « Excess-3 ». [13] Например, цифра BCD 6 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 с использованием формата big-endian программа будет кодировать следующим образом:
Десятичная: 0 1 2 3 4 5Двоичный: 0000 0001 0010 0011 0100 0101
Здесь самый значимый полубайт самого значимого байта был закодирован как ноль, поэтому число хранится как 012345
(но процедуры форматирования могут заменить или удалить ведущие нули). Упакованный BCD более эффективен в использовании памяти, чем неупакованный BCD; кодирование того же числа (с ведущим нулем) в неупакованном формате заняло бы в два раза больше памяти.
Операции сдвига и маскирования используются для упаковки или распаковки упакованной цифры BCD. Другие побитовые операции используются для преобразования числа в эквивалентную ему битовую комбинацию или обратного процесса.
В упакованном BCD (или упакованном десятичном [38] ) каждый полубайт представляет десятичную цифру. [nb 8] Упакованный BCD используется по крайней мере с 1960-х годов и с тех пор реализован во всем оборудовании мэйнфреймов IBM. Большинство реализаций имеют big endian , т. е. с более значимой цифрой в верхней половине каждого байта и с самым левым байтом (находящимся по самому низкому адресу памяти), содержащим самые значимые цифры упакованного десятичного значения. Младший полубайт самого правого байта обычно используется в качестве флага знака, хотя некоторые беззнаковые представления не имеют флага знака.
Например, 4-байтовое значение состоит из 8 полубайтов, где верхние 7 полубайтов хранят цифры 7-значного десятичного значения, а низший полубайт указывает знак десятичного целого значения. Стандартные значения знака — 1100 ( hex C) для положительного (+) и 1101 (D) для отрицательного (−). Это соглашение исходит из поля зоны для символов EBCDIC и знакового представления overpunch .
Другие разрешенные знаки — 1010 (A) и 1110 (E) для положительных и 1011 (B) для отрицательных. Процессоры IBM System/360 будут использовать знаки 1010 (A) и 1011 (B), если бит A установлен в PSW, для стандарта 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). Системы Burroughs использовали 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 Medium Systems (происходящих от серии Electrodata 200 1950-х годов).
Представления в виде дополнения до десятков для отрицательных чисел предлагают альтернативный подход к кодированию знака упакованных (и других) чисел BCD. В этом случае положительные числа всегда имеют старшую значащую цифру между 0 и 4 (включительно), тогда как отрицательные числа представлены дополнением до десятков соответствующего положительного числа.
В результате эта система допускает 32-битные упакованные числа BCD в диапазоне от −50 000 000 до +49 999 999, а −1 представляется как 99999999. (Как и в случае с двоичными числами в дополнительном коде, диапазон не является симметричным относительно нуля.)
Десятичные числа с фиксированной точкой поддерживаются некоторыми языками программирования (например, COBOL и PL/I). Эти языки позволяют программисту указывать неявную десятичную точку перед одной из цифр.
Например, упакованное десятичное значение, закодированное байтами 12 34 56 7C, представляет собой значение с фиксированной точкой +1 234,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:
Ф1 Ф2 Ф7 Ф9 Ф5 С01 2 7 9. 5 +0
Можно выполнить сложение , сначала выполнив сложение в двоичном формате, а затем преобразовав в 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 и ЦП семейства x86 предоставляют код операции 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 в BCD, а затем должно быть вычислено дополнение до десятков 0002.
IBM использовала термины Binary-Coded Decimal Interchange Code (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 , представленная одиночным нулевым пробитием на карте и (8,2) в основной памяти. [43]
Память IBM 1620 организована в 6-битные адресуемые цифры, обычные 8, 4, 2, 1 плюс F , используемый как бит флага, и C , бит проверки на нечетность. Буквенно- десятичные коды кодируются с использованием пар цифр, с «зоной» в четной адресованной цифре и «цифрой» в нечетной адресованной цифре, «зона» связана с «зонными перфораторами» 12 , 11 и 0 , как в серии 1400. Аппаратное обеспечение трансляции ввода-вывода преобразует внутренние пары цифр во внешние стандартные 6-битные коды BCD.
В десятичной архитектуре IBM 7070 , IBM 7072 и IBM 7074 буквенно-цифровые данные кодируются с использованием пар цифр (используя код «два из пяти» в цифрах, а не BCD) 10-значного слова, с «зоной» в левой цифре и «цифрой» в правой цифре. Аппаратное обеспечение преобразования ввода/вывода преобразуется между внутренними парами цифр и внешними стандартными 6-битными кодами BCD.
С введением System/360 IBM расширила 6-битный BCD алфавитно-цифровой код до 8-битного EBCDIC, что позволило добавлять гораздо больше символов (например, строчные буквы). Также реализован упакованный тип числовых данных BCD переменной длины, предоставляющий машинные инструкции, которые выполняют арифметические операции непосредственно над упакованными десятичными данными.
В IBM 1130 и 1800 упакованный BCD поддерживается программно с помощью пакета коммерческих подпрограмм IBM.
Сегодня данные BCD по-прежнему активно используются в базах данных IBM, таких как IBM Db2 , и процессорах, таких как z/Architecture и POWER6 , а также более поздних процессорах Power ISA . В этих продуктах BCD обычно представляет собой зонированный BCD (как в EBCDIC или ASCII), упакованный BCD (две десятичные цифры на байт) или «чистую» кодировку BCD (одна десятичная цифра, сохраненная как BCD в нижних четырех битах каждого байта). Все они используются в аппаратных регистрах и процессорах, а также в программном обеспечении.
Серия VAX от Digital Equipment Corporation включает инструкции , которые могут выполнять арифметические операции непосредственно с упакованными данными BCD и выполнять преобразования между упакованными данными BCD и другими целочисленными представлениями. [41] Упакованный формат BCD VAX совместим с форматом IBM System/360 и более поздними совместимыми процессорами IBM. Реализации MicroVAX и более поздние реализации VAX исключили эту возможность из ЦП, но сохранили совместимость кода с более ранними машинами за счет реализации отсутствующих инструкций в программной библиотеке, поставляемой операционной системой. Это вызывается автоматически через обработку исключений при обнаружении несуществующих инструкций, так что программы, использующие их, могут выполняться без изменений на более новых машинах.
Многие процессоры имеют аппаратную поддержку для целочисленной арифметики в кодировке BCD. Например, 6502 , [44] [45] Motorola серии 68000 , [46] и серии x86 . [47] Архитектура Intel x86 поддерживает уникальный 18-разрядный (десятибайтовый) формат BCD , который может быть загружен и сохранен из регистров с плавающей точкой, откуда могут выполняться вычисления. [48]
В более современных компьютерах такие возможности почти всегда реализованы в программном обеспечении, а не в наборе инструкций центрального процессора, однако числовые данные в формате BCD по-прежнему чрезвычайно распространены в коммерческих и финансовых приложениях.
Существуют приемы для реализации упакованных BCD и зонных десятичных операций сложения или вычитания с использованием коротких, но сложных для понимания последовательностей словесно-параллельной логики и двоичных арифметических операций. [49] Например, следующий код (написанный на языке C ) вычисляет беззнаковое 8-разрядное упакованное сложение BCD с использованием 32-битных двоичных операций:
uint32_t BCDadd ( uint32_t a , uint32_t b ) { uint32_t t1 , t2 ; // беззнаковые 32-битные промежуточные значения t1 = a + 0x06666666 ; t2 = t1 ^ b ; // сумма без распространения переноса t1 = t1 + b ; // предварительная сумма t2 = t1 ^ t2 ; // все двоичные биты переноса t2 = ~ t2 & 0x11111110 ; // только биты переноса BCD t2 = ( t2 >> 2 ) | ( t2 >> 3 ); // исправление возврата t1 - t2 ; // исправленная сумма BCD }
BCD распространен в электронных системах, где числовое значение должно быть отображено, особенно в системах, состоящих исключительно из цифровой логики и не содержащих микропроцессор. Используя BCD, можно значительно упростить обработку числовых данных для отображения, рассматривая каждую цифру как отдельную подсхему.
Это гораздо ближе соответствует физической реальности аппаратного обеспечения дисплея — например, разработчик может выбрать использование ряда отдельных идентичных семисегментных дисплеев для построения измерительной схемы. Если числовое количество хранится и обрабатывается как чисто двоичное, взаимодействие с таким дисплеем потребует сложной схемы. Поэтому в случаях, когда вычисления относительно просты, работа с BCD может привести к более простой системе в целом, чем преобразование в двоичный код и обратно. Большинство карманных калькуляторов выполняют все свои вычисления в BCD.
Тот же аргумент применим, когда оборудование этого типа использует встроенный микроконтроллер или другой небольшой процессор. Часто представление чисел внутри в формате BCD приводит к меньшему коду, поскольку преобразование из двоичного представления или в двоичное может быть дорогим на таких ограниченных процессорах. Для этих приложений некоторые небольшие процессоры имеют выделенные арифметические режимы, которые помогают при написании процедур, которые манипулируют величинами BCD. [50] [51]
Существуют различные реализации 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.
Этот формат используется в современной мобильной телефонии для отправки набранных номеров, а также идентификатора оператора (кортеж MCC/MNC), IMEI , IMSI (SUPI) и т. д. [56] [57]
Если ошибки в представлении и вычислениях важнее скорости преобразования в дисплей и обратно, можно использовать масштабированное двоичное представление, которое хранит десятичное число как двоично-кодированное целое число и двоично-кодированную десятичную экспоненту со знаком. Например, 0,2 можно представить как 2 × 10−1 .
Это представление позволяет быстро умножать и делить, но может потребовать сдвига на степень 10 во время сложения и вычитания для выравнивания десятичных точек. Это подходит для приложений с фиксированным числом десятичных знаков, которые затем не требуют этой корректировки, в частности, финансовых приложений, где обычно достаточно 2 или 4 цифр после десятичной точки. Действительно, это почти форма арифметики с фиксированной точкой, поскольку позиция точки основания подразумевается.
Кодировки Герца и Чена–Хо обеспечивают булевы преобразования для преобразования групп из трех цифр, закодированных в формате BCD, в 10-битные значения и обратно [ nb 1] , которые могут быть эффективно закодированы на оборудовании всего с 2 или 3 задержками вентиля. Плотно упакованная десятичная система (DPD) — это похожая схема [nb 1] , которая используется для большинства значимых чисел , за исключением ведущей цифры, для одной из двух альтернативных десятичных кодировок, указанных в стандарте плавающей точки IEEE 754-2008 .
BIOS во многих персональных компьютерах хранит дату и время в формате BCD, поскольку чип часов реального времени MC6818 , используемый в оригинальной материнской плате IBM PC AT, обеспечивал время, закодированное в формате BCD. Эта форма легко преобразуется в ASCII для отображения. [58] [59]
В 8-битных компьютерах Atari используется формат BCD для чисел с плавающей точкой. Процессор MOS Technology 6502 имеет режим BCD для инструкций сложения и вычитания. Программное обеспечение, поставляемое производителем карманного компьютера Psion Organiser 1, также использует BCD для реализации чисел с плавающей точкой; более поздние модели Psion используют исключительно двоичный формат.
Ранние модели PlayStation 3 хранили дату и время в формате BCD. Это привело к всемирному сбою консоли 1 марта 2010 года. Последние две цифры года, сохраненные в формате BCD, были неверно интерпретированы как 16, что привело к ошибке в дате устройства и сделало большинство функций неработоспособными. Это было названо проблемой 2010 года .
В деле Готтшалк против Бенсона 1972 года Верховный суд США отменил решение суда низшей инстанции , разрешившего патент на преобразование чисел в кодировке BCD в двоичную систему на компьютере.
В решении отмечалось, что патент «полностью предвосхитил бы математическую формулу и на практике был бы патентом на сам алгоритм ». [60] Это было знаменательное решение, определившее патентоспособность программного обеспечения и алгоритмов .
[…] 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 страниц) (Примечание. Помимо комбинаторного набора 4-битных BCD «кодов с минимальной путаницей для десятичных чисел», из которых автор иллюстрирует только один явно (здесь воспроизведен как код I) в виде 4-битного графика, автор также показывает 16-позиционный 4-битный «двоичный код для аналоговых данных» в виде кодовой таблицы, которая, однако, здесь не обсуждается. Код II, показанный здесь, является модификацией кода I, обсуждаемого Бергером.)
[…] Циклический код выгоден в основном при использовании релейных схем, поскольку тогда липкое реле не будет давать ложного состояния, поскольку оно задерживается при переходе от одного циклического числа к другому. Существует много других циклических кодов, которые обладают этим свойством. […][12] (xxiv+835+1 страницы) (Примечание. Ледли классифицировал описанный циклический код как циклический десятичный двоичный код .)
[…] При работе с целыми числами BCD в
регистрах общего назначения
значения BCD могут быть распакованы (одна цифра BCD на байт) или упакованы (две цифры BCD на байт). Значением распакованного целого числа BCD является двоичное значение младшего
полубайта
(биты с 0 по 3). Старший полубайт (биты с 4 по 7) может иметь любое значение во время сложения и вычитания, но должен быть равен нулю во время умножения и деления. Упакованные целые числа BCD позволяют содержать две цифры BCD в одном байте. Здесь цифра в старшем полубайте более значима, чем цифра в младшем полубайте. […] При работе с целыми числами BCD в регистрах данных
x87
FPU
значения BCD упаковываются в 80-битный формат и называются десятичными целыми числами. В этом формате первые 9 байтов содержат 18 цифр BCD, по 2 цифры на байт.
Наименее значимая цифра
содержится в младшем полубайте байта 0, а
наиболее значимая цифра
содержится в старшем полубайте байта 9. Наиболее значимый бит байта 10 содержит
бит знака
(0 = положительный и 1 = отрицательный; биты с 0 по 6 байта 10 являются битами
безразличия
). Отрицательные десятичные целые числа не хранятся в форме
дополнения до двух
; они отличаются от положительных десятичных целых чисел только битом знака. Диапазон десятичных целых чисел, которые могут быть закодированы в этом формате, составляет от −10
18
+ 1 до 10
18
− 1. Формат десятичных целых чисел существует только в памяти. Когда десятичное целое число загружается в регистр данных x87 FPU, оно автоматически преобразуется в
формат с плавающей точкой двойной расширенной точности
. Все десятичные целые числа точно представляются в формате двойной расширенной точности. […]
[13]