3

我偶尔会使用 Delphi 5 来完成编程工作,包括为我的电子业务提供的一个不错的商业应用程序。多年来,我已经用它完成了一些图形、数据库和其他一般工作。

今天,我正在做一个模拟,我想根据一些物理原理移动像素,细节在应用程序上并不重要,但我整个上午和昨天的一些时间都在寻找如何使用 Square Root 和 Square 函数没有得到奇怪的答案。通过检查分配给扩展变量类型“vector_length”的简单计算,我在计算时得到类似的结果(数字是固定的,但与表示这些数字的任何浮点类型的结果相同):

vector_length := Sqrt(Sqr(3.4) + Sqr(3)) 

从理论上讲,这给了我大约 4.53。使用计算器足够合理。

Delphi 的调试器向我展示了这样的内容:

2.9134839203548e-322

这显然是一个没有意义的浮点表示。

代码不像预期的那样工作,所以我只能认为数学是错误的,或者我做错了什么,期望函数给我一些符合合理结果的东西?

感谢您的任何意见。

4

1 回答 1

5

表达没有问题。我用这个(Delphi 2007)进行了测试 - 我不再有 D5,但我不相信它们之间SqrSqrt之间有太多(如果有的话)改变:

program Project3;

{$APPTYPE CONSOLE}

uses
  SysUtils, Math;

var
  Vector_Len: Extended;

begin
  Vector_Len :=  Sqrt(Sqr(3.4) + Sqr(3));
  WriteLn('Vector_Len: ' + Format('%f', [Vector_Len]));
  ReadLn;
end.

这产生了以下控制台输出:

在此处输入图像描述

不过,我认为@Uwe 正在做某事。我认为您所看到的不是调试器故障。我认为这正是您决定检查价值的地方。将代码更改为此(这显然是一个“仅用于显示目的”的测试应用程序,因为该函数在这种情况下毫无意义,而且您显然不会使用 avar然后立即将其分配给Result该函数):

program Project3;

{$APPTYPE CONSOLE}

uses
  SysUtils, Math;

function CalcVectorLen: Extended;
var
  Vector_Len: Extended;
begin
  Vector_Len :=  Sqrt(Sqr(3.4) + Sqr(3));
  Result := Vector_Len;
end;

begin
  WriteLn('Vector_Len: ' + Format('%f', [CalcVectorLen]));
  ReadLn;
end.

在行上设置一个断点Vector_Len := Sqrt(,然后运行。调试器显示此输出(您的实际值可能会有所不同):

(注意:无法捕获实际的调试器弹出评估窗口,但它与Local Variables调试监视窗口中用箭头标记的内容相同。)

在此处输入图像描述

发生的情况是,Vector_Len在表达式计算实际发生并将结果分配给变量之前,您正在检查 的未初始化值。如果您在剩下的过程中运行该应用程序,您会看到控制台窗口仍然显示正确的输出。

于 2012-04-26T19:34:03.787 回答