diff options
author | Raymond Hettinger <rhettinger@users.noreply.github.com> | 2022-12-23 22:35:58 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-23 22:35:58 (GMT) |
commit | 5d84966cce6c596da22922a07f49bde959ff5201 (patch) | |
tree | e44414a0ff5f02233158709844e0932b08f54c63 /Lib/test/test_builtin.py | |
parent | 1ecfd1ebf1f53ef6ac82085b25ed09952b470d4e (diff) | |
download | cpython-5d84966cce6c596da22922a07f49bde959ff5201.zip cpython-5d84966cce6c596da22922a07f49bde959ff5201.tar.gz cpython-5d84966cce6c596da22922a07f49bde959ff5201.tar.bz2 |
GH-100425: Improve accuracy of builtin sum() for float inputs (GH-100426)
Diffstat (limited to 'Lib/test/test_builtin.py')
-rw-r--r-- | Lib/test/test_builtin.py | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index eb1c389..c656004 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -9,6 +9,7 @@ import fractions import gc import io import locale +import math import os import pickle import platform @@ -31,6 +32,7 @@ from test.support import (swap_attr, maybe_get_event_loop_policy) from test.support.os_helper import (EnvironmentVarGuard, TESTFN, unlink) from test.support.script_helper import assert_python_ok from test.support.warnings_helper import check_warnings +from test.support import requires_IEEE_754 from unittest.mock import MagicMock, patch try: import pty, signal @@ -38,6 +40,12 @@ except ImportError: pty = signal = None +# Detect evidence of double-rounding: sum() does not always +# get improved accuracy on machines that suffer from double rounding. +x, y = 1e16, 2.9999 # use temporary values to defeat peephole optimizer +HAVE_DOUBLE_ROUNDING = (x + y == 1e16 + 4) + + class Squares: def __init__(self, max): @@ -1617,6 +1625,8 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(repr(sum([-0.0])), '0.0') self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0') self.assertEqual(repr(sum([], -0.0)), '-0.0') + self.assertTrue(math.isinf(sum([float("inf"), float("inf")]))) + self.assertTrue(math.isinf(sum([1e308, 1e308]))) self.assertRaises(TypeError, sum) self.assertRaises(TypeError, sum, 42) @@ -1641,6 +1651,14 @@ class BuiltinTest(unittest.TestCase): sum(([x] for x in range(10)), empty) self.assertEqual(empty, []) + @requires_IEEE_754 + @unittest.skipIf(HAVE_DOUBLE_ROUNDING, + "sum accuracy not guaranteed on machines with double rounding") + @support.cpython_only # Other implementations may choose a different algorithm + def test_sum_accuracy(self): + self.assertEqual(sum([0.1] * 10), 1.0) + self.assertEqual(sum([1.0, 10E100, 1.0, -10E100]), 2.0) + def test_type(self): self.assertEqual(type(''), type('123')) self.assertNotEqual(type(''), type(())) |