Использование двоично-десятичной арифметики (BCD)
Borland C++, также как и большинство прочих компьютеров и
компиляторов, выполняет математические вычисления с числами в
двоичном представлении (то есть в системе счисления с основанием
2). Это иногда путает людей, привыкших исключительно к десятичной
математике (в системе счисления с основанием 10). Многие числа с
точным представлением в десятичной системе счисления, такие как
0.01, в двоичной системе счисления могут иметь лишь приближенные
представления.
В большинстве прикладных программ двоичные числа предпочтительны, однако в некоторых ситуациях ошибка округления в преобразованиях между системами счисления с основаниями 2 и 10 нежелательна. Наиболее характерным случаем здесь являются финансовые
или учетные задачи, где предполагается сложение центов. Рассмотрим программу, складывающую до 100 центов и вычитающую доллар:
#include <stdio.h>
int i;
float x =0.0;
for (i = 0; i < 100; ++i)
x += 0.01;
x -= 1.0;
print("100*.01 - 1 = %g\1",x);
Правильным ответом является 0.0, однако ответ, полученный
данной программой, будет малой величиной, близкой к 0.0. При вычислении ошибка округления, возникающая во время преобразования
0.01 в двоичное число, накапливается. Изменение типа x на double
или long double только уменьшает ошибку вычисления, но не устраняет ее вообще.
Для решения этой проблемы Borland C++ предлагает специфический для C++ тип bcd (двоично-десятичный), объявленный в файле
bcd.h. В случае двоично-десятичного представления число 0.01 будет иметь точное значение, а переменная x типа bcd даст точное
исчисление центов.
#include <bcd.h>
int i;
bcd x = 0.0;
for (i = 0; i < 100; ++i)
x += 0.01;
x -= 1.0;
cout << "100*0.1 - 1 = " << x << "\n";
При этом необходимо учитывать следующие особенности типа
bcd:
аргументов с типом bcd переопределяются.