@@ -397,6 +397,21 @@ def test_705836(self):
397397 big = (1 << 25 ) - 1
398398 big = math .ldexp (big , 127 - 24 )
399399 self .assertRaises (OverflowError , struct .pack , ">f" , big )
400+ self .assertRaises (OverflowError , struct .pack , "<f" , big )
401+ # same for native format, see gh-145633
402+ self .assertRaises (OverflowError , struct .pack , "f" , big )
403+
404+ # And for half-floats
405+ big = (1 << 11 ) - 1
406+ big = math .ldexp (big , 15 - 10 )
407+ packed = struct .pack (">e" , big )
408+ unpacked = struct .unpack (">e" , packed )[0 ]
409+ self .assertEqual (big , unpacked )
410+ big = (1 << 12 ) - 1
411+ big = math .ldexp (big , 15 - 11 )
412+ self .assertRaises (OverflowError , struct .pack , ">e" , big )
413+ self .assertRaises (OverflowError , struct .pack , "<e" , big )
414+ self .assertRaises (OverflowError , struct .pack , "e" , big )
400415
401416 def test_1530559 (self ):
402417 for code , byteorder in iter_integer_formats ():
@@ -1016,6 +1031,24 @@ def test_operations_on_half_initialized_Struct(self):
10161031 self .assertRaises (RuntimeError , repr , S )
10171032 self .assertEqual (S .size , - 1 )
10181033
1034+ def test_float_round_trip (self ):
1035+ for format in (
1036+ "f" , "<f" , ">f" ,
1037+ "d" , "<d" , ">d" ,
1038+ "e" , "<e" , ">e" ,
1039+ ):
1040+ with self .subTest (format = format ):
1041+ f = struct .unpack (format , struct .pack (format , 1.5 ))[0 ]
1042+ self .assertEqual (f , 1.5 )
1043+ f = struct .unpack (format , struct .pack (format , NAN ))[0 ]
1044+ self .assertTrue (math .isnan (f ), f )
1045+ f = struct .unpack (format , struct .pack (format , INF ))[0 ]
1046+ self .assertTrue (math .isinf (f ), f )
1047+ self .assertEqual (math .copysign (1.0 , f ), 1.0 )
1048+ f = struct .unpack (format , struct .pack (format , - INF ))[0 ]
1049+ self .assertTrue (math .isinf (f ), f )
1050+ self .assertEqual (math .copysign (1.0 , f ), - 1.0 )
1051+
10191052
10201053class UnpackIteratorTest (unittest .TestCase ):
10211054 """
0 commit comments