сложение вместо вычитания в алгоритме Кахана

Это алгоритм суммирования Кахана из Википедии :

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 в исходном алгоритме? Разве круглые скобки не лишние, поскольку - в любом случае левоассоциативны?

8
задан fredoverflow 9 December 2011 в 14:22
поделиться