有没有人在申请中使用过Kahan总结?什么时候额外的精度会有用?
我听说在某些平台上,双重操作比浮动操作更快。如何在我的机器上测试?
答案 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
当您使用较低精度的浮点类型时,如果不确定是否满足精度要求,并且不允许切换到更大、精度更高的类型。