这是 Kahan summation algorithm from Wikipedia :
function KahanSum(input)
var sum = 0.0
var c = 0.0
for i = 1 to input.length do
y = input[i] - c // why subtraction?
t = sum + y
c = (t - sum) - y
sum = t
return sum
它使用减法(而不是加法)是否有特定原因?如果我在 c
的计算中交换操作数,我可以使用加法代替吗?不知何故,这对我来说更有意义:
function KahanSum(input)
var sum = 0.0
var c = 0.0
for i = 1 to input.length do
y = input[i] + c // addition instead of subtraction
t = sum + y
c = y - (t - sum) // swapped operands
sum = t
return sum
或者我还不知道浮点加法和减法之间有什么奇怪的区别?
还有,原算法中的(t - sum) - y
和t - sum - y
有什么区别吗?括号不是多余的吗,因为 -
无论如何都是左关联的?
最佳答案
据我所知,您的方法与维基百科中的方法完全相同。唯一的区别是 c
的符号——以及它的含义——被颠倒了。在维基百科算法中,c
是求和的“错误”部分; c=0.0001 表示总和比应有的大一点。在您的版本中,c
是对总和的“更正”; c=-0.0001 表示总和要小一点。
而且我认为括号是为了便于阅读。它们适用于我们,而不适用于机器。
关于c++ - Kahan算法中的加法而不是减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8446857/