[Python-ideas] Numerical instability was: Re: Introduce collections.Reiterable
Serhiy Storchaka
storchaka at gmail.com
Fri Sep 20 23:53:43 CEST 2013
20.09.13 13:45, Oscar Benjamin написав(ла):
> If you know of a one-pass algorithm (or a way to improve the
> implementation I showed) that is as accurate as either the two_pass or
> three_pass methods I'd be very interested to see it (I'm sure Steven
> would be as well).
import sys
fmin = sys.float_info.min
finvmin = int(1 / sys.float_info.min)
def i2f1(i):
return i // finvmin + (i % finvmin) * fmin
def i2f2(i):
return i2f1(i // finvmin) + (i % finvmin) * fmin * fmin
def variance_incremental_exact(data):
n = 0
sumx = 0
sumx2 = 0
for x in data:
i = int(x)
x = i * finvmin + int(round((x - i) * finvmin))
n += 1
sumx += x
sumx2 += x * x
ss = sumx2 * n - sumx * sumx
d = n * (n - 1)
return i2f2(ss // d) + i2f2(ss % d) / float(d)
More information about the Python-ideas
mailing list