Add more tests and assertions for math.hypot() and math.dist() (GH-8747)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Sun, 12 Aug 2018 19:15:23 +0000 (12:15 -0700)
committerGitHub <noreply@github.com>
Sun, 12 Aug 2018 19:15:23 +0000 (12:15 -0700)
Lib/test/test_math.py
Modules/mathmodule.c

index 448110b1674aeda442e6c8a07dfa244fa870af52..fff82fe7fadb97b4f57b12e12e47aa936748997e 100644 (file)
@@ -751,6 +751,10 @@ class MathTests(unittest.TestCase):
         self.assertEqual(1.0,
             math.copysign(1.0, hypot(-0.0))        # Convert negative zero to positive zero
         )
+        self.assertEqual(                          # Handling of moving max to the end
+            hypot(1.5, 1.5, 0.5),
+            hypot(1.5, 0.5, 1.5),
+        )
 
         # Test handling of bad arguments
         with self.assertRaises(TypeError):         # Reject keyword args
@@ -771,7 +775,7 @@ class MathTests(unittest.TestCase):
         self.assertEqual(hypot(-INF, -INF), INF)
         self.assertEqual(hypot(10, -INF), INF)
 
-        # If no infinity, any NaN gives a Nan.
+        # If no infinity, any NaN gives a NaN.
         self.assertTrue(math.isnan(hypot(NAN)))
         self.assertTrue(math.isnan(hypot(0, NAN)))
         self.assertTrue(math.isnan(hypot(NAN, 10)))
@@ -831,9 +835,13 @@ class MathTests(unittest.TestCase):
         self.assertEqual(1.0,                      # Convert negative zero to positive zero
             math.copysign(1.0, dist((0.0,), (-0.0,)))
         )
+        self.assertEqual(                          # Handling of moving max to the end
+            dist((1.5, 1.5, 0.5), (0, 0, 0)),
+            dist((1.5, 0.5, 1.5), (0, 0, 0))
+        )
 
         # Verify tuple subclasses are allowed
-        class T(tuple):     # tuple subclas
+        class T(tuple):
             pass
         self.assertEqual(dist(T((1, 2, 3)), ((4, 2, -1))), 5.0)
 
@@ -855,8 +863,7 @@ class MathTests(unittest.TestCase):
         with self.assertRaises(ValueError):        # Check dimension agree
             dist((1, 2, 3), (4, 5, 6, 7))
 
-
-        # Verify that the one dimensional case equivalent to abs()
+        # Verify that the one dimensional case is equivalent to abs()
         for i in range(20):
             p, q = random.random(), random.random()
             self.assertEqual(dist((p,), (q,)), abs(p - q))
@@ -870,7 +877,7 @@ class MathTests(unittest.TestCase):
                     # Any infinite difference gives positive infinity.
                     self.assertEqual(dist(p, q), INF)
                 elif any(map(math.isnan, diffs)):
-                    # If no infinity, any NaN gives a Nan.
+                    # If no infinity, any NaN gives a NaN.
                     self.assertTrue(math.isnan(dist(p, q)))
 
         # Verify scaling for extremely large values
index 896cf8dcd5bdeb7a4397ea82a5c059f5e52bb6eb..ab49dcef288417e1a46a023f6bb721b997828da9 100644 (file)
@@ -2071,6 +2071,7 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan)
     assert(n > 0);
     for (i=0 ; i < n-1 ; i++) {
         x = vec[i];
+        assert(Py_IS_FINITE(x) && x >= 0.0 && x <= max);
         if (x == max) {
             x = vec[n-1];
             vec[n-1] = max;