估计浮点计算中的错误

时间:2012-04-17 18:31:48

标签: .net floating-point double

IEEE浮点数学的一个重要特性是,由于位数和base-2格式的限制,舍入会导致计算中出现“错误”。

E.g。在C#中:

(Math.PI * 1e20 / 1e20) == Math.PI; // false

有没有办法确定这些操作的错误程度? .NET公开了Double.Epsilon字段,该字段给出的最小有效值大于零,但这与比较非零数字无关。

编辑:我不是要求完全计算错误的方法,我只是想找到一种方法来估计它的大小。

例如(再次,在C#中):

(1e20 + 1e3) == 1e20; // true
(1e20 + 1e4) == 1e20; // false

因此,操作1e20 + X的错误似乎大约为1e3,这是有道理的,因为doubles最多包含十进制精度的17位数。

1 个答案:

答案 0 :(得分:0)

你需要的是机器epsilon(你可以计算)而不是最小(denorm)正数:有关奇怪的命名约定,请参阅http://www.johndcook.com/blog/2010/06/08/c-math-gotchas/

一旦你拥有了机器epsilon,你知道(根据IEEE标准)任何基本代数运算*,+,/, - 的相对误差至多为epsilon,即x flop y =(x op y) (1 + delta)其中:

  • flop是浮点运算,例如一个浮点添加
  • op是实际算术中的相应操作
  • delta是相对舍入误差,以| delta |为界< = epsilon