Функция BcdDivide ведет себя по-разному в Delphi XE и XE2

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

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