【问题标题】:Estimate error in floating point calculations浮点计算中的估计误差
【发布时间】:2012-04-29 03:06:01
【问题描述】:

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

【问题讨论】:

  • 我想你应该只根据你的计算来计算误差估计。您可以在这里找到一些有用的信息:stackoverflow.com/questions/3166851/….
  • 误差是离散和累积的,每次计算都可能出现也可能不出现。预测或计算每次计算的确切误差将非常耗时(您必须对另一个任意精度进行软件计算才能做到这一点),但可以做到。您也可以使用支持 80 位扩展精度浮点数的 delphi 之类的东西来做到这一点。
  • @Lucas:“根据你的计算计算误差估计”是什么意思?
  • @Henry:我的意思是,当您在算法中进行特定计算时(即当您的值为 x 并且您知道x的误差是0.1,你要计算10 * x,结果的误差是10 * 0.1 = 1 )。现在在您更新的问题中,我看到您只想获得它的近似值,但我想可以考虑尝试计算它。
  • @Lucas:我说的是 IEEE 浮点规范中的舍入误差,而不是实验测量误差。例如。在我的“编辑”部分,所有这些数字都由 IEEE 双精度数精确表示,但计算机进行的加法计算仍然存在错误。

标签: .net floating-point double


【解决方案1】:

您需要的是机器 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| 为界

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2016-03-31
    • 2013-10-13
    相关资源
    最近更新 更多