Delphi 计算出的值错误
Wrong value calculated by Delphi
我有一条记录声明为
T3DVector = record
X,Y,Z: Integer;
end;
类型T3DVector的一个变量V持有:
V.X= -25052
V.Y= 34165
V.Z= 37730
然后我尝试下一行。 D 声明为 Double.
D:= (V.X*V.X) + (V.Y*V.Y) + (V.Z*V.Z);
return值为:-1076564467 (0xFFFFFFFFBFD4EE0D)
下面的代码应该是等价的:
D:= (V.X*V.X);
D:= D + (V.Y*V.Y);
D:= D + (V.Z*V.Z);
但是,returns 3218402829 (0x00000000BFD4EE0D),这实际上是正确的值。
看高位,以为是溢出问题。当我打开溢出检查时,第一行停止并出现异常“Integer overflow”。这让我更加困惑,因为 D 是 Double,而我只将值存储到 D
有人可以澄清一下吗?
赋值语句的 target 与右侧的计算方式无关。在右侧,您拥有的所有类型都是 Integer
,因此表达式被评估为该类型。
如果要将右侧计算为其他类型,则至少有一个操作数必须具有该类型。当您将语句分成多个步骤并将 D
合并到表达式的右侧时,您就看到了这一点。 V.Y * V.Y
的值仍被评估为类型 Integer
,但结果 提升 具有类型 Double
以便它与加法项中的其他操作数 (D
).
D
是双精度数这一事实不会影响 X、Y 和 Z 的类型。它们是 Integer
,显然不够大,无法存储此类的平方大数,它们的乘法就是溢出。你为什么不把它们也声明为双打?
我有一条记录声明为
T3DVector = record
X,Y,Z: Integer;
end;
类型T3DVector的一个变量V持有:
V.X= -25052
V.Y= 34165
V.Z= 37730
然后我尝试下一行。 D 声明为 Double.
D:= (V.X*V.X) + (V.Y*V.Y) + (V.Z*V.Z);
return值为:-1076564467 (0xFFFFFFFFBFD4EE0D)
下面的代码应该是等价的:
D:= (V.X*V.X);
D:= D + (V.Y*V.Y);
D:= D + (V.Z*V.Z);
但是,returns 3218402829 (0x00000000BFD4EE0D),这实际上是正确的值。
看高位,以为是溢出问题。当我打开溢出检查时,第一行停止并出现异常“Integer overflow”。这让我更加困惑,因为 D 是 Double,而我只将值存储到 D
有人可以澄清一下吗?
赋值语句的 target 与右侧的计算方式无关。在右侧,您拥有的所有类型都是 Integer
,因此表达式被评估为该类型。
如果要将右侧计算为其他类型,则至少有一个操作数必须具有该类型。当您将语句分成多个步骤并将 D
合并到表达式的右侧时,您就看到了这一点。 V.Y * V.Y
的值仍被评估为类型 Integer
,但结果 提升 具有类型 Double
以便它与加法项中的其他操作数 (D
).
D
是双精度数这一事实不会影响 X、Y 和 Z 的类型。它们是 Integer
,显然不够大,无法存储此类的平方大数,它们的乘法就是溢出。你为什么不把它们也声明为双打?