Я только что попробовал следующий код:
procedure TTTest.FormCreate(Sender: TObject);
var v: extended;
one: extended;
begin
one := 1.0;
v := 100*Power(1.25,one);
end;
Он просто компилируется и запускается, как и ожидалось в Delphi 5.
Я предполагаю, что флаг деления на ноль может быть установлен вне вашегокод (даже если вы не ссылаетесь на код C ++, вызов Direct X или чего-то подобного может иметь тот же эффект), но будет поднят позже, в _Frac
.
Единственный вызов Frac
в стандартной реализации Power()
- это проверка Frac(Exponent) = 0.0
.
В Delphi 5 и Delphi произошла модификация реализации Frac
6.
Вот версия Delphi 5:
procedure _FRAC;
asm
FLD ST(0)
SUB ESP,4
FSTCW [ESP]
FWAIT
FLDCW cwChop
FRNDINT
FWAIT
FLDCW [ESP]
ADD ESP,4
FSUB
end;
Вот версия Delphi 6:
procedure _FRAC;
asm
FLD ST(0)
SUB ESP,4
FNSTCW [ESP].Word // save
FNSTCW [ESP+2].Word // scratch
FWAIT
OR [ESP+2].Word, $0F00 // trunc toward zero, full precision
FLDCW [ESP+2].Word
FRNDINT
FWAIT
FLDCW [ESP].Word
ADD ESP,4
FSUB
end;
Из приведенного выше кода вы узнаетечто следующие команды вызвали возникновение отложенных исключений перед выпуском Delphi 6: Trunc, Frac, Ceil.
Так что, я думаю, вы столкнулись с проблемой в Delphi 5, которая была исправлена в Delphi 6. Вы можетеиспользовать свою собственную версию Power, например, такую:
function Power(Base, Exponent: Extended): Extended;
begin
if Exponent = 0.0 then
Result := 1.0 { n**0 = 1 }
else if (Base = 0.0) and (Exponent > 0.0) then
Result := 0.0 { 0**n = 0, n > 0 }
else
Result := Exp(Exponent * Ln(Base))
end;