Delphi 5浮点数乘法和数学运算问题

3
我使用 Delphi 5 做一些偶尔的编程工作,包括为我的电子商务应用程序编写的良好的业务应用程序。多年来,我已经使用它完成了一些图形、数据库和其他一般性的工作。
今天,我正在制作一个模拟器,其中我想根据一些物理原理移动像素,但是在搜索了整个上午和昨天的一部分后,我仍然不知道如何使用平方根和平方函数而不会得到奇怪的答案。通过检查一个简单的计算,将其分配给一个扩展变量类型“vector_length”,当计算时(数字固定,但使用任何浮点类型表示这些数字时都会得到相同的结果):
vector_length := Sqrt(Sqr(3.4) + Sqr(3)) 

根据计算,理论上给了我大约4.53。使用计算器来说是合理的。

Delphi的调试器显示的内容如下:

2.9134839203548e-322

这显然是一个浮点数表示,毫无意义。

代码并没有按照预期工作,所以我只能认为数学计算有误或者我在期望函数给我合理结果方面做错了什么?

谢谢任何建议。


4
您上面的一句话没有任何问题。(虽然可以使用"Hypot"函数更简洁地书写。) - Andreas Rejbrand
4
你是在越过那条线之后看到这个值,还是当你正好站在那条线上时看到的? - Uwe Raabe
1
@Uwe,我认为你说得很对。请看我的编辑后的答案。 :) 如果你想回滚并发布自己的答案,随意这样做,我不会生气。 - Ken White
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.

这导致了以下控制台输出: enter image description here 我认为@Uwe说的有道理。我认为你看到的不是调试器故障;我认为这只是你决定检查值的地方。将代码更改为以下内容(显然,这是一个“仅用于显示目的”的测试应用程序,因为该函数在此上下文中没有意义,并且您显然不会像此函数一样使用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.

Vector_Len := Sqrt(行上设置断点并运行。调试器会显示这个输出(实际值可能会有所不同):
(注意:无法捕获实际的调试器弹出评估窗口,但它与Local Variables调试监视窗口中标记的内容相同。) enter image description here 发生的情况是您正在检查未初始化的Vector_Len的值,而在表达式评估实际发生并将结果分配给变量之前。如果您继续运行应用程序,您将看到控制台窗口仍然显示正确的输出。

谢谢你的见解!我会进行更多的测试,并确保在调试器和某些显示方式下知道正在发生的事情。非常高兴现在成为StackOverflow的一部分! - user1359407

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接