我只是想下面的代碼:
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
中提出。
標準實施Power()
中唯一致電Frac
的是測試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 5已經修復了這個問題。您可能需要使用自己的動力版本,像這樣的:
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;
聽起來不太合理。我認爲你的調試工具並沒有把你指向正確的地方,或者變量不能保持你的想法。 –
不記得D5是否已經擁有它,但是當你執行代碼時,你是否嘗試檢查CPU/FPU視圖中發生了什麼? – 2011-11-08 09:04:31
@ldsandon當然D5已經允許使用Alt-F2並進入CPU/FPU視圖。好主意。但是我猜想一個未處理的FPU異常會在'System._Frac'代碼中破壞。 –