在Kahan算法中加法而不是减法

fre*_*low 8 c++ floating-point rounding-error sum ieee-754

这是维基百科Kahan求和算法:

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
Run Code Online (Sandbox Code Playgroud)

是否有一个特定的原因,它使用减法(而不是添加)?如果我在计算中交换操作数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
Run Code Online (Sandbox Code Playgroud)

或者浮点加法和减法之间是否有一些奇怪的区别我还不知道呢?

此外,原始算法之间(t - sum) - y和之间有什么区别t - sum - y吗?括号不是多余的,因为它-是左关联的,无论如何?

Bet*_*eta 2

据我所知,您的方法与维基百科中的方法完全相同。唯一的区别是 的符号c——以及它的含义——被颠倒了。在维基百科算法中,c是总和的“错误”部分;c=0.0001 意味着总和比应有的要大一些。在您的版本中,c是对总和的“修正”;c=-0.0001 表示总和应该稍微小一些。

我认为括号是为了可读性。它们是为我们服务的,而不是为机器服务的。