Четвертый Borland C++ и его окружение

       

Использование двоично-десятичной арифметики (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 не уничтожает ошибку округления вообще. Вычисление типа 1.0/3.0 все равно будет иметь ошибку округления.
  • Обычные математические функции, такие как sqrt и log, для

    аргументов с типом bcd переопределяются.

  • Числа типа bcd имеют точность представления около 17 разрядов и диапазон принимаемых значений от 1x10^-125 до 1x10^125.


  • Содержание раздела