[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