Delphi 5与浮点乘法和数学

Delphi 5与浮点乘法和数学,delphi,math,delphi-5,Delphi,Math,Delphi 5,我偶尔使用Delphi5进行编程,包括为我的电子业务开发一个不错的商业应用程序。多年来,我用它做了一些图形、数据库和一般的其他工作 今天,我在做一个模拟,我想根据一些物理原理移动像素,应用程序中的细节并不重要,但我整个上午和昨天都在搜索,想知道如何使用平方根和平方函数,而不会得到奇怪的答案。通过检查分配给扩展变量类型“vector_length”的简单计算,我在计算时得到如下结果(数字是固定的,但与表示这些数字的任何浮点类型的结果相同): 理论上,这给了我大约4.53。使用计算器是很合理的 De

我偶尔使用Delphi5进行编程,包括为我的电子业务开发一个不错的商业应用程序。多年来,我用它做了一些图形、数据库和一般的其他工作

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

理论上,这给了我大约4.53。使用计算器是很合理的

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

2.9134839203548e-322
这显然是一种毫无意义的浮点表示

代码不能像预期的那样工作,所以我只能认为数学是错误的,或者我在期望函数给出合理结果的过程中做了一些错误的事情


感谢您的输入。

表达式没有问题。我用它进行了测试(Delphi 2007)-我不再有D5了,但我不相信它们之间的
Sqr
Sqrt
会有什么变化:

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已经了解了一些事情。我认为你看到的不是调试器的小故障;我想这正是你决定检查价值的地方。将代码更改为此(这显然是一个“仅用于显示目的”的测试应用程序,因为此函数在此上下文中毫无意义,并且您显然不会像此函数那样使用
var
,然后立即将其分配给
结果
):

Vector\u Len:=Sqrt(
行)上设置断点,然后运行。调试器显示此输出(实际值可能会有所不同):

(注意:无法捕获实际的调试器弹出式求值窗口,但它与
局部变量
调试监视窗口中用箭头标记的窗口相同。)


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

绝对没有问题使用上面的一行代码。(虽然可以使用
Hypot
函数更简洁地编写。)当您已经跨过该行或正好在该行时,您是否看到了该值?@Uwe,我想您已经搞定了。请查看我编辑的答案。:)如果您想回滚并发布自己的答案,请随意这样做,我不会生气。@KenWhite,没关系-我很高兴能帮上忙。谢谢你的洞察力!我将继续进行更多的测试,确保我知道调试器中发生了什么,并通过一些显示。很高兴成为StackOverflow的一员!
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.
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.