gh-122234: fix accuracy issues for sum() (#122236)

* Use compensated summation for complex sums with floating-point items.
  This amends #121176.

* sum() specializations for floats and complexes now use
  PyLong_AsDouble() instead of PyLong_AsLongAndOverflow() and
  compensated summation as well.
This commit is contained in:
Sergey B Kirpichev 2024-07-29 06:56:40 +03:00 committed by GitHub
parent bc93923a2d
commit 169e7138ab
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 22 additions and 11 deletions

View file

@ -1778,6 +1778,8 @@ class BuiltinTest(unittest.TestCase):
self.assertRaises(TypeError, sum, [], '')
self.assertRaises(TypeError, sum, [], b'')
self.assertRaises(TypeError, sum, [], bytearray())
self.assertRaises(OverflowError, sum, [1.0, 10**1000])
self.assertRaises(OverflowError, sum, [1j, 10**1000])
class BadSeq:
def __getitem__(self, index):
@ -1803,6 +1805,9 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(sum([1.0, 10E100, 1.0, -10E100, 2j]), 2+2j)
self.assertEqual(sum([2+1j, 10E100j, 1j, -10E100j]), 2+2j)
self.assertEqual(sum([1j, 1, 10E100j, 1j, 1.0, -10E100j]), 2+2j)
self.assertEqual(sum([2j, 1., 10E100, 1., -10E100]), 2+2j)
self.assertEqual(sum([1.0, 10**100, 1.0, -10**100]), 2.0)
self.assertEqual(sum([2j, 1.0, 10**100, 1.0, -10**100]), 2+2j)
self.assertEqual(sum([0.1j]*10 + [fractions.Fraction(1, 10)]), 0.1+1j)
def test_type(self):