9
9
import gc
10
10
import io
11
11
import locale
12
+ import math
12
13
import os
13
14
import pickle
14
15
import platform
31
32
from test .support .os_helper import (EnvironmentVarGuard , TESTFN , unlink )
32
33
from test .support .script_helper import assert_python_ok
33
34
from test .support .warnings_helper import check_warnings
35
+ from test .support import requires_IEEE_754
34
36
from unittest .mock import MagicMock , patch
35
37
try :
36
38
import pty , signal
37
39
except ImportError :
38
40
pty = signal = None
39
41
40
42
43
+ # Detect evidence of double-rounding: sum() does not always
44
+ # get improved accuracy on machines that suffer from double rounding.
45
+ x , y = 1e16 , 2.9999 # use temporary values to defeat peephole optimizer
46
+ HAVE_DOUBLE_ROUNDING = (x + y == 1e16 + 4 )
47
+
48
+
41
49
class Squares :
42
50
43
51
def __init__ (self , max ):
@@ -1617,6 +1625,8 @@ def test_sum(self):
1617
1625
self .assertEqual (repr (sum ([- 0.0 ])), '0.0' )
1618
1626
self .assertEqual (repr (sum ([- 0.0 ], - 0.0 )), '-0.0' )
1619
1627
self .assertEqual (repr (sum ([], - 0.0 )), '-0.0' )
1628
+ self .assertTrue (math .isinf (sum ([float ("inf" ), float ("inf" )])))
1629
+ self .assertTrue (math .isinf (sum ([1e308 , 1e308 ])))
1620
1630
1621
1631
self .assertRaises (TypeError , sum )
1622
1632
self .assertRaises (TypeError , sum , 42 )
@@ -1641,6 +1651,14 @@ def __getitem__(self, index):
1641
1651
sum (([x ] for x in range (10 )), empty )
1642
1652
self .assertEqual (empty , [])
1643
1653
1654
+ @requires_IEEE_754
1655
+ @unittest .skipIf (HAVE_DOUBLE_ROUNDING ,
1656
+ "sum accuracy not guaranteed on machines with double rounding" )
1657
+ @support .cpython_only # Other implementations may choose a different algorithm
1658
+ def test_sum_accuracy (self ):
1659
+ self .assertEqual (sum ([0.1 ] * 10 ), 1.0 )
1660
+ self .assertEqual (sum ([1.0 , 10E100 , 1.0 , - 10E100 ]), 2.0 )
1661
+
1644
1662
def test_type (self ):
1645
1663
self .assertEqual (type ('' ), type ('123' ))
1646
1664
self .assertNotEqual (type ('' ), type (()))
0 commit comments