[Python-Dev] sum()

Alex Martelli aleaxit at yahoo.com
Fri Mar 11 20:08:09 CET 2005


On Mar 11, 2005, at 19:39, Raymond Hettinger wrote:

> [Alex]
>> If you're considering revisions to sum's design, my suggestion would
> be
>> to find a way to let the user tell sum to use a more accurate approach
>> when summing floats.
>
> FWIW, when accuracy is an issue, I use:
>
>    sum(sorted(data, key=abs))

...and you may still lose a LOT of accuracy that way:-(.

Raymond, you technically reviewed the 2nd ed Cookbook -- don't you 
recall the sidebar about why partials are the RIGHT way to do 
summations?  I was SO proud of that one, thought I'd made the issue 
clearest than anywhere previously in print...

To summarize: as we all know, a+b loses significant digits from (say) b 
when abs(a) is much larger than abs(b).  Now, say we're summing a 
million numbers, all positive and roughly the same magnitude.  If we do 
it by total += item (which is basically what sum does), by the time 
we've summed the first 100,000 or so total IS *much larger than item* 
in absolute value -- we're systematically tossing away about 5 digits 
from each new item by that time!!!

To avoid such a massacre of digits, one uses partials -- summing items 
two at a time to get half as many partials, then iterating that idea 
about log2(N) times when summing N items.  Problem is, one needs O(N) 
auxiliary space (assuming one can't just overwrite the incoming 
list/array/whatever).

There's all other kinds of accuracy issues with a+b, but the one 
partials-based summation deals with is numero uno in many real-life 
situations, e.g. when one needs to get (say) the total area from N 
regions, each of roughly the same magnitude, whose areas were 
separately measured -- total length from N segments ditto -- total mass 
of N items ditto -- and so forth.


Alex



More information about the Python-Dev mailing list