@@ -2637,9 +2637,10 @@ def test_fma_nan_results(self):
26372637
26382638 # If any input is a NaN, the result should be a NaN, too.
26392639 for a , b in itertools .product (values , repeat = 2 ):
2640- self .assertIsNaN (math .fma (math .nan , a , b ))
2641- self .assertIsNaN (math .fma (a , math .nan , b ))
2642- self .assertIsNaN (math .fma (a , b , math .nan ))
2640+ with self .subTest (a = a , b = b ):
2641+ self .assertIsNaN (math .fma (math .nan , a , b ))
2642+ self .assertIsNaN (math .fma (a , math .nan , b ))
2643+ self .assertIsNaN (math .fma (a , b , math .nan ))
26432644
26442645 def test_fma_infinities (self ):
26452646 # Cases involving infinite inputs or results.
@@ -2651,57 +2652,62 @@ def test_fma_infinities(self):
26512652 for c in non_nans :
26522653 for infinity in [math .inf , - math .inf ]:
26532654 for zero in [0.0 , - 0.0 ]:
2654- with self .assertRaises (ValueError ):
2655- math .fma (infinity , zero , c )
2656- with self .assertRaises (ValueError ):
2657- math .fma (zero , infinity , c )
2655+ with self .subTest (c = c , infinity = infinity , zero = zero ):
2656+ with self .assertRaises (ValueError ):
2657+ math .fma (infinity , zero , c )
2658+ with self .assertRaises (ValueError ):
2659+ math .fma (zero , infinity , c )
26582660
26592661 # ValueError when a*b and c both infinite of opposite signs.
26602662 for b in positives :
2661- with self .assertRaises (ValueError ):
2662- math .fma (math .inf , b , - math .inf )
2663- with self .assertRaises (ValueError ):
2664- math .fma (math .inf , - b , math .inf )
2665- with self .assertRaises (ValueError ):
2666- math .fma (- math .inf , - b , - math .inf )
2667- with self .assertRaises (ValueError ):
2668- math .fma (- math .inf , b , math .inf )
2669- with self .assertRaises (ValueError ):
2670- math .fma (b , math .inf , - math .inf )
2671- with self .assertRaises (ValueError ):
2672- math .fma (- b , math .inf , math .inf )
2673- with self .assertRaises (ValueError ):
2674- math .fma (- b , - math .inf , - math .inf )
2675- with self .assertRaises (ValueError ):
2676- math .fma (b , - math .inf , math .inf )
2663+ with self .subTest (b = b ):
2664+ with self .assertRaises (ValueError ):
2665+ math .fma (math .inf , b , - math .inf )
2666+ with self .assertRaises (ValueError ):
2667+ math .fma (math .inf , - b , math .inf )
2668+ with self .assertRaises (ValueError ):
2669+ math .fma (- math .inf , - b , - math .inf )
2670+ with self .assertRaises (ValueError ):
2671+ math .fma (- math .inf , b , math .inf )
2672+ with self .assertRaises (ValueError ):
2673+ math .fma (b , math .inf , - math .inf )
2674+ with self .assertRaises (ValueError ):
2675+ math .fma (- b , math .inf , math .inf )
2676+ with self .assertRaises (ValueError ):
2677+ math .fma (- b , - math .inf , - math .inf )
2678+ with self .assertRaises (ValueError ):
2679+ math .fma (b , - math .inf , math .inf )
26772680
26782681 # Infinite result when a*b and c both infinite of the same sign.
26792682 for b in positives :
2680- self .assertEqual (math .fma (math .inf , b , math .inf ), math .inf )
2681- self .assertEqual (math .fma (math .inf , - b , - math .inf ), - math .inf )
2682- self .assertEqual (math .fma (- math .inf , - b , math .inf ), math .inf )
2683- self .assertEqual (math .fma (- math .inf , b , - math .inf ), - math .inf )
2684- self .assertEqual (math .fma (b , math .inf , math .inf ), math .inf )
2685- self .assertEqual (math .fma (- b , math .inf , - math .inf ), - math .inf )
2686- self .assertEqual (math .fma (- b , - math .inf , math .inf ), math .inf )
2687- self .assertEqual (math .fma (b , - math .inf , - math .inf ), - math .inf )
2683+ with self .subTest (b = b ):
2684+ self .assertEqual (math .fma (math .inf , b , math .inf ), math .inf )
2685+ self .assertEqual (math .fma (math .inf , - b , - math .inf ), - math .inf )
2686+ self .assertEqual (math .fma (- math .inf , - b , math .inf ), math .inf )
2687+ self .assertEqual (math .fma (- math .inf , b , - math .inf ), - math .inf )
2688+ self .assertEqual (math .fma (b , math .inf , math .inf ), math .inf )
2689+ self .assertEqual (math .fma (- b , math .inf , - math .inf ), - math .inf )
2690+ self .assertEqual (math .fma (- b , - math .inf , math .inf ), math .inf )
2691+ self .assertEqual (math .fma (b , - math .inf , - math .inf ), - math .inf )
26882692
26892693 # Infinite result when a*b finite, c infinite.
26902694 for a , b in itertools .product (finites , finites ):
2691- self .assertEqual (math .fma (a , b , math .inf ), math .inf )
2692- self .assertEqual (math .fma (a , b , - math .inf ), - math .inf )
2695+ with self .subTest (b = b ):
2696+ self .assertEqual (math .fma (a , b , math .inf ), math .inf )
2697+ self .assertEqual (math .fma (a , b , - math .inf ), - math .inf )
26932698
26942699 # Infinite result when a*b infinite, c finite.
26952700 for b , c in itertools .product (positives , finites ):
2696- self .assertEqual (math .fma (math .inf , b , c ), math .inf )
2697- self .assertEqual (math .fma (- math .inf , b , c ), - math .inf )
2698- self .assertEqual (math .fma (- math .inf , - b , c ), math .inf )
2699- self .assertEqual (math .fma (math .inf , - b , c ), - math .inf )
2701+ with self .subTest (b = b , c = c ):
2702+ self .assertEqual (math .fma (math .inf , b , c ), math .inf )
2703+ self .assertEqual (math .fma (- math .inf , b , c ), - math .inf )
2704+ self .assertEqual (math .fma (- math .inf , - b , c ), math .inf )
2705+ self .assertEqual (math .fma (math .inf , - b , c ), - math .inf )
27002706
2701- self .assertEqual (math .fma (b , math .inf , c ), math .inf )
2702- self .assertEqual (math .fma (b , - math .inf , c ), - math .inf )
2703- self .assertEqual (math .fma (- b , - math .inf , c ), math .inf )
2704- self .assertEqual (math .fma (- b , math .inf , c ), - math .inf )
2707+ self .assertEqual (math .fma (b , math .inf , c ), math .inf )
2708+ self .assertEqual (math .fma (b , - math .inf , c ), - math .inf )
2709+ self .assertEqual (math .fma (- b , - math .inf , c ), math .inf )
2710+ self .assertEqual (math .fma (- b , math .inf , c ), - math .inf )
27052711
27062712 # gh-73468: On some platforms, libc fma() doesn't implement IEE 754-2008
27072713 # properly: it doesn't use the right sign when the result is zero.
@@ -2714,23 +2720,24 @@ def test_fma_zero_result(self):
27142720
27152721 # Zero results from exact zero inputs.
27162722 for b in nonnegative_finites :
2717- self .assertIsPositiveZero (math .fma (0.0 , b , 0.0 ))
2718- self .assertIsPositiveZero (math .fma (0.0 , b , - 0.0 ))
2719- self .assertIsNegativeZero (math .fma (0.0 , - b , - 0.0 ))
2720- self .assertIsPositiveZero (math .fma (0.0 , - b , 0.0 ))
2721- self .assertIsPositiveZero (math .fma (- 0.0 , - b , 0.0 ))
2722- self .assertIsPositiveZero (math .fma (- 0.0 , - b , - 0.0 ))
2723- self .assertIsNegativeZero (math .fma (- 0.0 , b , - 0.0 ))
2724- self .assertIsPositiveZero (math .fma (- 0.0 , b , 0.0 ))
2725-
2726- self .assertIsPositiveZero (math .fma (b , 0.0 , 0.0 ))
2727- self .assertIsPositiveZero (math .fma (b , 0.0 , - 0.0 ))
2728- self .assertIsNegativeZero (math .fma (- b , 0.0 , - 0.0 ))
2729- self .assertIsPositiveZero (math .fma (- b , 0.0 , 0.0 ))
2730- self .assertIsPositiveZero (math .fma (- b , - 0.0 , 0.0 ))
2731- self .assertIsPositiveZero (math .fma (- b , - 0.0 , - 0.0 ))
2732- self .assertIsNegativeZero (math .fma (b , - 0.0 , - 0.0 ))
2733- self .assertIsPositiveZero (math .fma (b , - 0.0 , 0.0 ))
2723+ with self .subTest (b = b ):
2724+ self .assertIsPositiveZero (math .fma (0.0 , b , 0.0 ))
2725+ self .assertIsPositiveZero (math .fma (0.0 , b , - 0.0 ))
2726+ self .assertIsNegativeZero (math .fma (0.0 , - b , - 0.0 ))
2727+ self .assertIsPositiveZero (math .fma (0.0 , - b , 0.0 ))
2728+ self .assertIsPositiveZero (math .fma (- 0.0 , - b , 0.0 ))
2729+ self .assertIsPositiveZero (math .fma (- 0.0 , - b , - 0.0 ))
2730+ self .assertIsNegativeZero (math .fma (- 0.0 , b , - 0.0 ))
2731+ self .assertIsPositiveZero (math .fma (- 0.0 , b , 0.0 ))
2732+
2733+ self .assertIsPositiveZero (math .fma (b , 0.0 , 0.0 ))
2734+ self .assertIsPositiveZero (math .fma (b , 0.0 , - 0.0 ))
2735+ self .assertIsNegativeZero (math .fma (- b , 0.0 , - 0.0 ))
2736+ self .assertIsPositiveZero (math .fma (- b , 0.0 , 0.0 ))
2737+ self .assertIsPositiveZero (math .fma (- b , - 0.0 , 0.0 ))
2738+ self .assertIsPositiveZero (math .fma (- b , - 0.0 , - 0.0 ))
2739+ self .assertIsNegativeZero (math .fma (b , - 0.0 , - 0.0 ))
2740+ self .assertIsPositiveZero (math .fma (b , - 0.0 , 0.0 ))
27342741
27352742 # Exact zero result from nonzero inputs.
27362743 self .assertIsPositiveZero (math .fma (2.0 , 2.0 , - 4.0 ))
@@ -2836,12 +2843,14 @@ def test_random(self):
28362843 '0x1.f5467b1911fd6p-2' , '0x1.b5cee3225caa5p-1' ),
28372844 ]
28382845 for a_hex , b_hex , c_hex , expected_hex in test_values :
2839- a = float .fromhex (a_hex )
2840- b = float .fromhex (b_hex )
2841- c = float .fromhex (c_hex )
2842- expected = float .fromhex (expected_hex )
2843- self .assertEqual (math .fma (a , b , c ), expected )
2844- self .assertEqual (math .fma (b , a , c ), expected )
2846+ with self .subTest (a_hex = a_hex , b_hex = b_hex , c_hex = c_hex ,
2847+ expected_hex = expected_hex ):
2848+ a = float .fromhex (a_hex )
2849+ b = float .fromhex (b_hex )
2850+ c = float .fromhex (c_hex )
2851+ expected = float .fromhex (expected_hex )
2852+ self .assertEqual (math .fma (a , b , c ), expected )
2853+ self .assertEqual (math .fma (b , a , c ), expected )
28452854
28462855 # Custom assertions.
28472856 def assertIsNaN (self , value ):
0 commit comments