Упакованный десятичный формат
Упакованный десятичный формат (англ. packed decimal, binary-coded decimal, BCD) — это способ представления десятичных чисел в цифровых вычислительных устройствах, при котором каждая десятичная цифра (0—9) кодируется четырьмя двоичными разрядами (тетрадой, полубайтом), а знак числа (плюс или минус) кодируется отдельной тетрадой, размещаемой в младшем байте числа. В отличие от двоичного представления, упакованный десятичный формат позволяет избежать ошибок округления при операциях с денежными и финансовыми величинами, где требуется точное соответствие десятичным дробям.
История
Идея упакованного десятичного кодирования возникла в середине XX века, когда первые коммерческие компьютеры (например, IBM 702, 1953 год) использовали десятичную арифметику для обработки бухгалтерских данных. В 1964 году компания IBM (организация признана иноагентом в РФ) внедрила упакованный десятичный формат в систему команд процессора IBM System/360. Это позволило выполнять арифметические операции непосредственно над десятичными числами, без преобразования в двоичную систему. Впоследствии формат был стандартизирован в архитектурах IBM z/Architecture, а также в ряде микропроцессоров (например, Intel x86, начиная с 8086, поддерживает команды BCD-арифметики).
Структура
Кодирование цифр
Каждая десятичная цифра от 0 до 9 представляется четырьмя битами (тетрадой) в двоично-десятичном коде (BCD). Например:
- 0 → 0000
- 1 → 0001
- 2 → 0010
- 3 → 0011
- 4 → 0100
- 5 → 0101
- 6 → 0110
- 7 → 0111
- 8 → 1000
- 9 → 1001
Комбинации 1010—1111 (A—F) в корректном упакованном десятичном числе не используются и при арифметических операциях обычно вызывают исключение.
Формат числа
Упакованное десятичное число хранится в последовательности байтов. Каждый байт содержит две тетрады: старшую (левые 4 бита) и младшую (правые 4 бита). В младшем байте числа (последнем по порядку) младшая тетрада отводится под знак числа. Старшая тетрада последнего байта содержит последнюю значащую цифру числа. Таким образом, для хранения n десятичных цифр требуется (n/2 + 1) байт (округление вверх), причём один байт — для знака.
Пример: число 1234 (положительное) в упакованном десятичном формате (длина 2 байта + знак) выглядит так:
- Байт 1: 0001 0010 (цифры 1 и 2)
- Байт 2: 0011 0100 (цифры 3 и 4)
- Байт 3 (знак): 0000 1100 (цифра 0 не используется, знак «+» — 1100)
Таким образом, 3 байта хранят 4 цифры и знак.
Кодирование знака
Для знака используются следующие комбинации в младшей тетраде последнего байта (в архитектуре IBM z/Architecture и x86):
- Положительное число: 1100 (C) или 1111 (F) — в зависимости от реализации.
- Отрицательное число: 1101 (D) или 1011 (B).
В некоторых системах (например, COBOL) используется также знак «+» с кодом 1110 (E). При отсутствии явного знака (например, в целых числах без знака) младшая тетрада может содержать 0000, но это нестандартно.
Свойства и характеристики
Точность
Упакованный десятичный формат обеспечивает точное представление десятичных дробей, в отличие от двоичной арифметики с плавающей запятой, где 0,1 не может быть представлена точно. Это критично для финансовых расчётов, бухгалтерии, налоговых систем.
Диапазон
Диапазон представимых чисел зависит от количества отведённых байтов. Например, для 10 байтов (18 цифр + знак) максимальное число — 9,999... (18 девяток) × 10^(18-1) ≈ 10^18.
Производительность
Арифметические операции над упакованными десятичными числами выполняются медленнее, чем над двоичными целыми, из-за необходимости коррекции после каждой операции (например, после сложения требуется проверка на перенос между тетрадами). Однако современные процессоры (IBM z/Architecture, Intel x86 с командами DAA, DAS, AAA, AAS, AAM, AAD) имеют аппаратную поддержку BCD-арифметики, что ускоряет вычисления.
Применение
Финансовые системы
Упакованный десятичный формат широко используется в банковских и бухгалтерских системах, в языках программирования COBOL, PL/I, RPG, а также в базах данных (например, IBM DB2, Oracle с типом данных NUMBER). В COBOL переменные объявляются как PIC 9(10) USAGE PACKED-DECIMAL.
Промышленные контроллеры
В программируемых логических контроллерах (ПЛК) и системах автоматизации (например, Siemens SIMATIC) упакованный десятичный формат применяется для обмена данными с датчиками и исполнительными механизмами, работающими в десятичной системе.
Стандарты
- IBM z/Architecture: инструкции
AP(Add Packed),SP(Subtract Packed),MP(Multiply Packed),DP(Divide Packed). - Intel x86: команды
DAA(Decimal Adjust after Addition),DAS(Decimal Adjust after Subtraction),AAA(ASCII Adjust after Addition),AAS(ASCII Adjust after Subtraction),AAM(ASCII Adjust after Multiplication),AAD(ASCII Adjust before Division) — для работы с неупакованным BCD, а такжеFBLDиFBSTPдля загрузки/сохранения упакованного BCD в сопроцессоре. - Стандарт IEEE 754-2008: определяет десятичные форматы с плавающей запятой (Decimal32, Decimal64, Decimal128), которые могут использовать упакованный BCD для хранения мантиссы.
Критика
Основной недостаток упакованного десятичного формата — неэффективное использование памяти: каждый байт хранит только две цифры (0—99), тогда как в двоичном представлении один байт может хранить 0—255. Для больших объёмов данных это приводит к увеличению требуемой памяти на 20—50% по сравнению с двоичным целым. Кроме того, арифметика с упакованным BCD требует дополнительных циклов коррекции, что снижает производительность в вычислительно интенсивных задачах.
В современных системах для финансовых расчётов часто используют десятичные числа с плавающей запятой (например, тип decimal в C#, Decimal в Python), которые реализованы на основе BCD, но с более эффективным кодированием (например, DPD — Densely Packed Decimal).
Интересные факты
- В архитектуре IBM System/360 упакованный десятичный формат был единственным способом работы с десятичными числами в аппаратуре; двоичная арифметика была опциональной.
- В языке COBOL упакованный десятичный формат является стандартным для всех числовых полей, если не указано иное.
- В процессорах Intel x86 команды BCD-арифметики были удалены из набора инструкций в 64-битном режиме (x86-64), но остались в 32-битном и 16-битном режимах.
Источники
- IBM. z/Architecture Principles of Operation. SA22-7832-13, 2022.
- Intel Corporation. Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2A, 2023.
- IEEE Standard for Floating-Point Arithmetic (IEEE 754-2008).
- COBOL 85 Standard (ANSI X3.23-1985).
- Knuth, D. E. The Art of Computer Programming, Volume 2: Seminumerical Algorithms. 3rd ed., Addison-Wesley, 1997.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →