Bug report
Bug description:
Unfortunately, #121176 was merged with a bug:
|
if (PyFloat_Check(item)) { |
|
double value = 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)) { |
|
long value; |
|
int overflow; |
|
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