【问题标题】:"Floating point overflow" error in Delphi codeDelphi代码中的“浮点溢出”错误
【发布时间】:2016-10-28 20:52:24
【问题描述】:

我在 Delphi 中有这个源代码,为什么我在运行代码时收到此错误 "Floating point overflow."?以及如何纠正?

错误信息:

代码:

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;

【问题讨论】:

  • for 循环中,您使用i 索引,但它未初始化,所以我希望Access violation,但是......你没有说你在哪一行得到错误.
  • 启用警告和提示以及范围检查,然后处理来自这些更改的内容。
  • @TomBrunberg 如何在 for 循环中初始化 i ?这一行的错误 V[i][j] := 5 * V[i][j] + 2.0 * Random;
  • 我们无法猜测代码的用途。你听我的建议了吗?
  • 嗯,在for 循环中,您访问X[i][j]V[i][j],但您从不给i 赋值,既不在循环之前,也不在循环内。也许您忘记了外部for i:= 0 n-1 do 循环。 MBo回答了你的实际问题,似乎是正确的答案。以后请关注@David 的评论,进行正常的调试。

标签: delphi debugging


【解决方案1】:

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

您进行了 2000 次迭代,因此您的结果可能高达 7^2000 ~ 10^1690,但 Double 类型的最大值约为 10^308。所以“浮点溢出”错误是准确的诊断。

发生错误时,您可以在调试监视或立即监视(鼠标悬停在 V[] 上)中看到大约 10^307 的 V[] 值。

您可以使用 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多