卡汉总结

时间:2011-02-09 00:15:21

标签: algorithm floating-point

有没有人在申请中使用过Kahan总结?什么时候额外的精度会有用?

我听说在某些平台上,双重操作比浮动操作更快。如何在我的机器上测试?

4 个答案:

答案 0 :(得分:6)

当你对数字求和时,

Kahan summation很有效,你需要最小化最坏情况的浮点错误。如果没有这种技术,如果有两个数字的大小与可用的有效数字不同(例如1 + 1e-12),则添加操作可能会严重损失精度。 Kahan总和补偿了这一点。

这里有浮点问题的优秀资源,“计算机科学家应该了解浮点数”:http://www.validlab.com/goldberg/paper.pdf

单一与双精度性能:是的,单精度可以明显更快,但它取决于特定的机器。请参阅:http://www.hpcwire.com/features/17885244.html

测试的最佳方法是编写一个简短的示例来测试您关注的操作,使用单一(浮点)和双精度,并测量运行时。

答案 1 :(得分:1)

我在计算运行平均值时使用了Kahan求和来补偿累积误差。它确实有很大的不同,而且很容易测试。我只消除了100次总结后消除了相当大的错误。

我肯定会使用Kahan求和算法来补偿任何运行总计中的错误。

但是,在进行逆矩阵乘法时,我注意到了很大的(1e-3)误差。基本上,A*x = y,然后inv(A)*y ~= x我没有完全恢复原始值。这很好,但我认为Kahan求和可能会有所帮助(有很多补充),尤其是大型矩阵> 3-by-3。我尝试使用4乘4的矩阵,但根本没有改善这种情况。

答案 2 :(得分:0)

我已将Kahan求和用于蒙特卡洛积分。您有一个标量值函数f,您认为该函数的计算成本很高。合理的估计值为65ns /维。然后,您将这些值累加成平均值,更新平均值大约需要4ns。因此,如果您使用Kahan求和(4倍的触发器,〜16ns)来更新平均值,那么您实际上并没有在总数中增加那么多的计算量。现在,通常会说蒙特卡洛积分的误差是σ/√ N ,但这是不正确的。实际误差范围(在有限精度算法中)为

σ/√ N + cond( I n )εN

其中cond( I n )是求和的条件数,而ε是单位舍入的两倍。因此,算法发散比其收敛更快。对于32位算术,获得εN〜1很简单:10 ^ 7评估可以非常快地完成,此后,您的Monte-Carlo积分将随机进行。当条件数很大时,情况甚至更糟。

如果使用Kahan求和,则错误的表达式将更改为

σ/√ N + cond( I n )ε 2 N,

尽管公认地,发散仍然快于收敛,但是ε 2 N在现代硬件上不能在合理的时间尺度上变大。

答案 3 :(得分:0)

<块引用>

额外的精度什么时候有用?

非常粗略:

案例 1

你什么时候

  • 总结大量数据
  • 以非顺序方式,即计算总和,然后将总和相加(而不是用运行总和迭代所有数据),

然后 Kahan 求和在第二阶段很有意义 - 当您对总和进行求和时,因为您现在避免的错误更重要,而开销仅支付整体求和运算。

案例 2

当您使用较低精度的浮点类型时,如果不确定是否满足精度要求,并且不允许切换到更大、精度更高的类型。