Bug report
Bug description:
Unfortunately, #121176 was merged with a bug:
| 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 be
2+2j). I'll provide a patch.
But maybe cases for integer arguments also should use compensated summation? E.g.:
| 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 chooses 2.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
Linked PRs
Bug report
Bug description:
Unfortunately, #121176 was merged with a bug:
cpython/Python/bltinmodule.c
Lines 2749 to 2755 in e968121
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.:
cpython/Python/bltinmodule.c
Lines 2689 to 2698 in e968121
on L2694 (and use
PyLong_AsDouble()). An example: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:CPython versions tested on:
CPython main branch
Operating systems tested on:
No response
Linked PRs