Функция BcdDivide ведет себя по-разному в Delphi XE и XE2 - PullRequest
67 голосов
/ 03 февраля 2012

FmtBcd.pas был тщательно переработан и переписан в Delphi XE2.В одном из моих проектов у меня есть случай, в котором используется операция деления для двух значений Bcd, но две версии дают разные результаты.В худшем случае Delphi XE2 может выдать Bcd overflow error.

Пример. Запуск следующего кода в консольных приложениях Delphi XE2:

var A, B, C, D: TBcd;
begin
  A := StrToBcd('1');
  B := StrToBcd('3');
  BcdDivide(A, B, C);
  WriteLn(BcdToStr(C));

  try
    BcdMultiply(C, C, D);
    WriteLn(BcdToStr(D));
  except
    on E: Exception do
      WriteLn(E.Message);
  end;

  ReadLn;
end.

Вывод вышеупомянутого будет:

0.333333333333333333333333333333333333333333333333333333333333333
BCD overflow

Переменная C содержит значение Bcd с 63 десятичными точками специфичности.Выполнение второй операции BcdMultiply с переменной C приведет к Bcd overflow error.

Однако выполнение того же кода в Delphi XE приводит к следующему результату без каких-либо исключений:

0.3333333333
0.11111111108888888889

Может ли кто-нибудь предложить лучший метод решения этой проблемы?

1 Ответ

6 голосов
/ 27 ноября 2012

Код, о котором идет речь, дает ожидаемый результат в обновлении 4 XE2. Обратите внимание, что обновление 3 приводит к неверному выводу, и поэтому ясно, что исправление поступило с обновлением 4. Кроме того, XE3 производит ожидаемый результат.

...