Delphi 5和浮点乘法和数学

use*_*407 3 delphi math delphi-5

我使用Delphi 5进行偶尔的编程工作,包括我的电子商务的一个不错的商业应用程序.多年来我用它完成了一些图形,数据库和其他一些东西.

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

vector_length := Sqrt(Sqr(3.4) + Sqr(3)) 
Run Code Online (Sandbox Code Playgroud)

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

Delphi的调试器给我看了这样的事情:

2.9134839203548e-322
Run Code Online (Sandbox Code Playgroud)

这显然是一个毫无意义的浮点表示.

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

感谢您的任何意见.

Ken*_*ite 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.
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

不过,我认为@Uwe会有所作为.我认为你所看到的不是调试器故障; 我认为这就是你决定检查价值的地方.将代码更改为此(这显然是"仅用于显示目的"测试应用程序,因为在此上下文中函数将毫无意义,并且您显然不会使用a var然后立即将其分配给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.
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

发生的事情是Vector_Len,在表达式评估实际发生并将结果分配给变量之前,您正在检查未初始化的值.如果你在剩下的时间里运行应用程序,你会看到控制台窗口仍然显示正确的输出.