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