99import  gc 
1010import  io 
1111import  locale 
12+ import  math 
1213import  os 
1314import  pickle 
1415import  platform 
3132from  test .support .os_helper  import  (EnvironmentVarGuard , TESTFN , unlink )
3233from  test .support .script_helper  import  assert_python_ok 
3334from  test .support .warnings_helper  import  check_warnings 
35+ from  test .support  import  requires_IEEE_754 
3436from  unittest .mock  import  MagicMock , patch 
3537try :
3638    import  pty , signal 
3739except  ImportError :
3840    pty  =  signal  =  None 
3941
4042
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+ 
4149class  Squares :
4250
4351    def  __init__ (self , max ):
@@ -1617,6 +1625,8 @@ def test_sum(self):
16171625        self .assertEqual (repr (sum ([- 0.0 ])), '0.0' )
16181626        self .assertEqual (repr (sum ([- 0.0 ], - 0.0 )), '-0.0' )
16191627        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 ])))
16201630
16211631        self .assertRaises (TypeError , sum )
16221632        self .assertRaises (TypeError , sum , 42 )
@@ -1641,6 +1651,14 @@ def __getitem__(self, index):
16411651        sum (([x ] for  x  in  range (10 )), empty )
16421652        self .assertEqual (empty , [])
16431653
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+ 
16441662    def  test_type (self ):
16451663        self .assertEqual (type ('' ),  type ('123' ))
16461664        self .assertNotEqual (type ('' ), type (()))
0 commit comments