Delphi代码中的"浮点溢出"错误

shd*_*com 1 delphi debugging

我在Delphi中有这个源代码,为什么我得到这个错误"浮点溢出".当我运行代码?以及如何纠正它?

错误消息:

在此输入图像描述

代码:

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;
Run Code Online (Sandbox Code Playgroud)

MBo*_*MBo 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;
Run Code Online (Sandbox Code Playgroud)