は、私はちょうど次のコードを試してみました:
procedure TTTest.FormCreate(Sender: TObject);
var v: extended;
one: extended;
begin
one := 1.0;
v := 100*Power(1.25,one);
end;
をデルファイ5.
に予想通りそれはちょうど私の推測では、ゼロフラグあたり部門は、コード外に設定することができるということであるコンパイルし、実行します(偶数C++コードにリンクしていない場合、Direct Xなどを呼び出すと同じ効果が得られる可能性がありますが、後で呼び出されるのは_Frac
です)。
Power()
の標準実装でFrac
への唯一の呼び出しがFrac(Exponent) = 0.0
をテストすることです。
ここ
デルファイ5バージョンであるデルファイ5とDelphi 6の間Frac
の実装における変形
あった:
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;
:ここ
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バージョンであります
上記のコードから、Delphi 6がリリースされる前に遅延例外が発生したことがわかります:Trunc、Frac、Ceil 。
だから、Delphi 6で修正された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ビューで何が起きているのかチェックしようとしましたか? –
@ldsandonもちろん、D5はすでにAlt-F2を使用してCPU/FPUビューにステップインできます。良いアイデア。しかし、私は未処理のFPU例外が 'System._Frac'コードで壊れてしまうと思います。 –