Repository navigation
Accuracy issues of sum() specialization for floats/complexes #122234
Description
Activity
- addedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Jul 24, 2024 CC @rhettinger for the second part (integer values). Is this an issue or a feature?
Actually, even without the
sum, we have:>>> x = 10 ** 100 >>> 1.0 + x + 1.0 - x 0.0
Hmm, with PyLong_AsDouble() + compensated summation it's even faster!
./python -m timeit -r11 -s 'xs=[1.0, 10**100, 1.0, -10**100]' 'sum(xs)' 500000 loops, best of 11: 634 nsec per loopwhile in the main:
$ ./python -m timeit -r11 -s 'xs=[1.0, 10**100, 1.0, -10**100]' 'sum(xs)' 500000 loops, best of 11: 801 nsec per loop- added a commit that references this issue
on Jul 24, 2024 PR is ready for review: #122236
It combines fixes for floats and integers. If second case requires more discussion or is "a feature", I can quickly revert that part.
- addedinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)
on Jul 24, 2024 - added a commit that references this issue
on Jul 29, 2024 - added a commit that references this issue
on Jul 29, 2024 The added error returns leak references. This was caught by the noGIL refleak buildbot (which runs more often than refleaks for regular-builds): https://buildbot.python.org/#/builders/1226/builds/2352/steps/6/logs/stdio
The added error returns leak references. This was caught by the noGIL refleak buildbot (which runs more often than refleaks for regular-builds): https://buildbot.python.org/#/builders/1226/builds/2352/steps/6/logs/stdio
PR is ready: #122405
My PR #122406 looks exactly the same :)
IMO, it's better to associate the PR with this issue, so the fix-up PR is kept together with the original.Reacted by Kirill Podoprigora and Sergey B Kirpichev- added a commit that references this issue
on Jul 29, 2024 Closing since the refleak is now fixed.
Reacted by Kirill Podoprigora
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