2016-10-23 4 views
1

Ich habe diesen Quellcode in Delphi, warum bekomme ich diesen Fehler "Floating-Point-Überlauf." wenn ich den Code ausführen? und wie man es korrigiert?"Floating-Point-Überlauf" Fehler in Delphi-Code

Die Fehlermeldung:

enter image description here

Der Code:

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

Im 'for' Schleifen Sie den' I' Index verwenden, aber es ist nicht initialisiert, so würde ich einen 'Zugang erwarten Verletzung', aber ... Sie haben nicht gesagt, auf welcher Zeile Sie den Fehler erhalten. –

+0

Aktivieren Sie Warnungen und Hinweise und Bereichsüberprüfung und dann, was aus diesen Änderungen kommt. –

+0

@TomBrunberg Wie initialisiert man ** i ** in der for-Schleife ?? Der Fehler in dieser Zeile ** V [i] [j]: = 5 * V [i] [j] + 2.0 * Zufällig; ** – shdotcom

Antwort

9

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

Sie machen 2000 Iterationen, so dass Ihre Ergebnisse so groß wie 7^2000 ~ 10^1690 sein können, aber der Maximalwert für den Double-Typ ist etwa 10^308. Der Fehler "Gleitkommaüberlauf" ist also eine exakte Diagnose.

Sie konnten V [] Werte über 10^307 in Debug Watch oder sofortige Überwachung (Maus über V []) sehen, wenn Fehler aufgetreten ist.

Sie können den erweiterten 10-Byte-Typ (wahrscheinlich nicht verfügbar für 64-Bit-Compiler) verwenden, um einen Überlauf für diese gegebenen Variablenwerte zu vermeiden, aber dies ist im Allgemeinen keine gute Lösung.

Abgesehen beachten Sie: Sie nicht, dass ich Index-Wert für diesen Code Stück festgelegt haben:

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