Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork34.1k
Closed
Description
Bug report
Bug description:
Unfortunately,#121176 was merged with a bug:
Lines 2749 to 2755 ine968121
| if (PyFloat_Check(item)) { | |
| doublevalue=PyFloat_AS_DOUBLE(item); | |
| re_sum.hi+=value; | |
| im_sum.hi+=0.0; | |
| _Py_DECREF_SPECIALIZED(item,_PyFloat_ExactDealloc); | |
| continue; | |
| } |
L2751 lacks cs_add(). Sorry for that. Reproducer:
sum([2j, 1., 10E100, 1., -10E100]) (should be2+2j). I'll provide a patch.But maybe cases for integer arguments also should use compensated summation? E.g.:
Lines 2689 to 2698 ine968121
| if (PyLong_Check(item)) { | |
| longvalue; | |
| intoverflow; | |
| value=PyLong_AsLongAndOverflow(item,&overflow); | |
| if (!overflow) { | |
| re_sum.hi+= (double)value; | |
| Py_DECREF(item); | |
| continue; | |
| } | |
| } |
on L2694 (and use
PyLong_AsDouble()). An example:>>>sum([1.0,10E100,1.0,-10E100])2.0>>>sum([1.0,10**100,1.0,-10**100])# huh?0.0
I would guess, that integer values in this case are treated as exact and they are allowed to smash floating-point result to garbage. But... This looks as a bug for me.fsum() also chooses2.0:
>>> math.fsum([1.0,10**100,1.0,-10**100])2.0
CPython versions tested on:
CPython main branch
Operating systems tested on:
No response