我刚刚尝试了以下代码:
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()
是 test Frac(Exponent) = 0.0
。
Frac
Delphi 5 和 Delphi 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;