In [8]:
from functools import reduce
In [9]:
def kahan_sum(xs):
s = c = 0
for x in xs:
v = x + c
s_next = s + v
c = v - (s_next - s)
s = s_next
return s
def naive_sum(xs):
return reduce(lambda x, y: x + y, xs)
In [14]:
a = [1e-10] * 100
naive_sum(a) == kahan_sum(a)
Out[14]:
In [18]:
naive_sum(a) == sum(a)
Out[18]:
In [17]:
naive_sum(a)
Out[17]:
In [16]:
kahan_sum(a)
Out[16]: