0

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

例如在 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 位的十进制精度。

4

1 回答 1

0

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

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

  • flop 是浮点运算,例如浮点加法
  • op 是实数算术中的对应运算
  • delta 是相对舍入误差,以 |delta| 为界 <= ε
于 2012-04-30T20:20:59.363 回答