2016-10-23 31 views
1

私はこのソースコードをDelphiで持っていますが、なぜこのエラーが発生しますか?「浮動小数点オーバーフロー」私はコードを実行しますか?それを修正する方法は?Delphiコードの「浮動小数点オーバーフロー」エラー

エラーメッセージ:

enter image description here

コード:見て、ここで

procedure TForm1.Button1Click(Sender: TObject); 
var n, d, i, j, maxiter , iter: Integer; 
Lower,Upper : Double; 
X, V : TArray<TArray<Double>>; 
begin 
    Lower := 0; 
    Upper := 0.2; 
    n := 100; 
    d := 55; 
    SetLength(V, n, d); 
    SetLength(X, n, d); 
    maxiter := 2000; 
    iter := 1; 

    for i:= 0 n-1 do 
    for j:=0 to d-1 do 
    begin 
     X[i][j]:= Lower + (Upper - Lower) * Random; 
     V[i][j] := 0.1 * X[i][j]; 
    end; 

while (iter <= maxiter) do 
    begin 
    for i:= 0 to n-1 do 
    for j:= 0 to D-1 do 
     V[i][j]:= 5 * V[i][j] + 2.0 * Random; 

    iter := iter +1; 
    end; 

end; 
+0

あなたは 'i'インデックスを使用し、' for'ループではなく、それが初期化されていないので、私は 'のアクセスを期待します違反ですが、...あなたはエラーをどのラインで受け取ったかは言いませんでした。 –

+0

警告とヒントと範囲チェックを有効にして、それらの変更に起因するものを処理します。 –

+0

@TomBrunberg forループで** i **を初期化する方法は?この行のエラー** V [i] [j]:= 5 * V [i] [j] + 2.0 * Random; ** – shdotcom

答えて

9

V[i][j]:= 5 * V[i][j] + 2.0 * Random;

2000回反復するので、結果は7^2000〜10^1690と大きくなることがありますが、Double型の最大値は約10^308です。したがって、「浮動小数点のオーバーフロー」エラーは正確な診断です。

エラーが発生したときに、デバッグウォッチまたは即時ウォッチ(マウスオーバーV [])でV []値が約10^307になることがあります。

これらの変数値のオーバーフローを避けるために、10バイトの拡張型(おそらく64ビットコンパイラでは使用できません)を使用できますが、これは一般的には良い解決策ではありません。あなたはこのコードピースのためのインデックスiの値が設定されていませんでした:脇

注意

for j:=0 to d-1 do 
    begin 
    X[i][j]:= Lower + (Upper - Lower) * Random; 
    V[i][j] := 0.1 * X[i][j]; 
    end; 
関連する問題