首页 文章

Delphi代码中的“浮点溢出”错误

提问于
浏览
1

我在Delphi中有这个源代码,当我运行代码时为什么会出现这个错误 "Floating point overflow." ?以及如何纠正它?

The error message:

enter image description here

The 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;

1 回答

  • 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;
    

相关问题