【问题标题】:Delphi 5 Strange result when sum double variablesDelphi 5 对双变量求和时的奇怪结果
【发布时间】:2013-12-17 13:51:40
【问题描述】:

在 Delphi 5 中,当将两个 double 类型的值相加,一个正值和另一个负值相同时,我遇到了奇怪的问题。

举例

dbv = 50071763.721
crv = -50071763.721

当两个值相加时结果应该是0,但我得到的结果类似于0.0000000074505805969

我在 excel 中求和,结果为 0。

【问题讨论】:

  • 这是世界上最常见的编程问题。
  • (您需要 Excel 来实现数学上 x + (-x) 等于零,这有点有趣...)
  • 每个程序员都应该知道的浮点运算知识:floating-point-gui.de
  • 欢迎来到浮点表示的世界。
  • 您正在处理浮点数(您肯定必须处理过四舍五入),而您的结果几乎为零和四舍五入的概念没有出现错误????

标签: delphi floating-point delphi-5


【解决方案1】:

您声称的内容是错误的。对于执行计算的 IEEE754 兼容单元,

x + (-x) = 0 

对于除 NaN 和 Inf 之外的所有 x。

您有两个值,这两个值都不等于问题中的值。我们可以确定这一点,因为这两个值都不能表示为二进制浮点值。因此,很明显,您已四舍五入到小数点后三位,但基本数字不是问题中出现的数字。显然,您的两个值具有不同的绝对值。

本主题必读:What Every Computer Scientist Should Know About Floating-Point Arithmetic

【讨论】:

  • +1 表示观察!我没想到。 (尽管这个“细节”可能不是 OP 学习的最重要的东西。)
  • Rudy 也对浮点数做了很好的总结:Floating point numbers.
【解决方案2】:
program TestXPlusMinusX;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var dbv, crv : double;

begin
  dbv := 50071763.721;
  crv := -50071763.721;
  if (dbv + crv) = 0 then WriteLn('Sum is Zero');
  WriteLn(dbv + crv);
end.

正如大卫所说,这给出了零。由于您没有向我们展示您的实际代码,我们只能说您告诉我们的不是您所做的。

【讨论】:

  • 始终测试等于 0 且 =0,以防您违反演示舍入。
  • @DavidHeffernan Fair point - 添加了该行。结果实际上是0.00000000000000E+0000,它伪造了OP的声明,但我同意,不一定证明结果完全为零。
【解决方案3】:

尝试对结果进行四舍五入 例如

uses Math;

function fnSumValue(): Double;
var
  dbv: Double;
  crv: Double;
begin
  dbv := 50071763.721;
  crv := -50071763.721;
  Result := Math.RoundTo(Abs(dbv) - Abs(crv), -6);
end;

【讨论】:

  • 为什么? dbv + crv 完全等于 0
【解决方案4】:

这是由于浮点数的表示方式。

您最好的机会是定义您需要的精度,例如 0.001。

将 dbv 和 crv 乘以 1000 (1/1000=0.001) 并舍入为整数。现在做你的总和。再除以 1000。这是您所需精度的结果。

result := (round(dbv*1000)+round(crv*1000))/1000;

【讨论】:

  • 这通常不会解决问题。例如,假设其中一个数字是 1.1110……,另一个是 1.1114999……。当以三位小数显示时,两者都会显示为“1.111”。前者乘以 1000,结果为 1111.0……,四舍五入为 1111,这很好。但是,当后者乘以 1000 时,由于四舍五入,结果可能是 1111.5,然后四舍五入为整数将产生 1112。然后将这些除以 1000 将产生不同的数字。
猜你喜欢
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 2011-11-28
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多