aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/test_math.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_math.py')
-rw-r--r--Lib/test/test_math.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py
index 46cb54647b1..e3b0d4fa9ee 100644
--- a/Lib/test/test_math.py
+++ b/Lib/test/test_math.py
@@ -17,6 +17,7 @@ import sys
eps = 1E-05
NAN = float('nan')
+NNAN = float('-nan')
INF = float('inf')
NINF = float('-inf')
FLOAT_MAX = sys.float_info.max
@@ -636,6 +637,92 @@ class MathTests(unittest.TestCase):
self.assertEqual(math.fmod(0.0, NINF), 0.0)
self.assertRaises(ValueError, math.fmod, INF, INF)
+ def test_fmax(self):
+ self.assertRaises(TypeError, math.fmax)
+ self.assertRaises(TypeError, math.fmax, 'x', 'y')
+
+ self.assertEqual(math.fmax(0., 0.), 0.)
+ self.assertEqual(math.fmax(1., 2.), 2.)
+ self.assertEqual(math.fmax(2., 1.), 2.)
+
+ self.assertEqual(math.fmax(+1., +0.), 1.)
+ self.assertEqual(math.fmax(+0., +1.), 1.)
+ self.assertEqual(math.fmax(+1., -0.), 1.)
+ self.assertEqual(math.fmax(-0., +1.), 1.)
+
+ self.assertEqual(math.fmax(-1., +0.), 0.)
+ self.assertEqual(math.fmax(+0., -1.), 0.)
+ self.assertEqual(math.fmax(-1., -0.), 0.)
+ self.assertEqual(math.fmax(-0., -1.), 0.)
+
+ for x in [NINF, -1., -0., 0., 1., INF]:
+ self.assertFalse(math.isnan(x))
+
+ with self.subTest(x=x, is_negative=math.copysign(1, x) < 0):
+ self.assertEqual(math.fmax(INF, x), INF)
+ self.assertEqual(math.fmax(x, INF), INF)
+ self.assertEqual(math.fmax(NINF, x), x)
+ self.assertEqual(math.fmax(x, NINF), x)
+
+ @requires_IEEE_754
+ def test_fmax_nans(self):
+ # When exactly one operand is NaN, the other is returned.
+ for x in [NINF, -1., -0., 0., 1., INF]:
+ with self.subTest(x=x, is_negative=math.copysign(1, x) < 0):
+ self.assertFalse(math.isnan(math.fmax(NAN, x)))
+ self.assertFalse(math.isnan(math.fmax(x, NAN)))
+ self.assertFalse(math.isnan(math.fmax(NNAN, x)))
+ self.assertFalse(math.isnan(math.fmax(x, NNAN)))
+ # When both operands are NaNs, fmax() returns NaN (see C11, F.10.9.2)
+ # whose sign is implementation-defined (see C11, F.10.0.3).
+ self.assertTrue(math.isnan(math.fmax(NAN, NAN)))
+ self.assertTrue(math.isnan(math.fmax(NNAN, NNAN)))
+ self.assertTrue(math.isnan(math.fmax(NAN, NNAN)))
+ self.assertTrue(math.isnan(math.fmax(NNAN, NAN)))
+
+ def test_fmin(self):
+ self.assertRaises(TypeError, math.fmin)
+ self.assertRaises(TypeError, math.fmin, 'x', 'y')
+
+ self.assertEqual(math.fmin(0., 0.), 0.)
+ self.assertEqual(math.fmin(1., 2.), 1.)
+ self.assertEqual(math.fmin(2., 1.), 1.)
+
+ self.assertEqual(math.fmin(+1., +0.), 0.)
+ self.assertEqual(math.fmin(+0., +1.), 0.)
+ self.assertEqual(math.fmin(+1., -0.), 0.)
+ self.assertEqual(math.fmin(-0., +1.), 0.)
+
+ self.assertEqual(math.fmin(-1., +0.), -1.)
+ self.assertEqual(math.fmin(+0., -1.), -1.)
+ self.assertEqual(math.fmin(-1., -0.), -1.)
+ self.assertEqual(math.fmin(-0., -1.), -1.)
+
+ for x in [NINF, -1., -0., 0., 1., INF]:
+ self.assertFalse(math.isnan(x))
+
+ with self.subTest(x=x, is_negative=math.copysign(1, x) < 0):
+ self.assertEqual(math.fmin(INF, x), x)
+ self.assertEqual(math.fmin(x, INF), x)
+ self.assertEqual(math.fmin(NINF, x), NINF)
+ self.assertEqual(math.fmin(x, NINF), NINF)
+
+ @requires_IEEE_754
+ def test_fmin_nans(self):
+ # When exactly one operand is NaN, the other is returned.
+ for x in [NINF, -1., -0., 0., 1., INF]:
+ with self.subTest(x=x, is_negative=math.copysign(1, x) < 0):
+ self.assertFalse(math.isnan(math.fmin(NAN, x)))
+ self.assertFalse(math.isnan(math.fmin(x, NAN)))
+ self.assertFalse(math.isnan(math.fmin(NNAN, x)))
+ self.assertFalse(math.isnan(math.fmin(x, NNAN)))
+ # When both operands are NaNs, fmin() returns NaN (see C11, F.10.9.3)
+ # whose sign is implementation-defined (see C11, F.10.0.3).
+ self.assertTrue(math.isnan(math.fmin(NAN, NAN)))
+ self.assertTrue(math.isnan(math.fmin(NNAN, NNAN)))
+ self.assertTrue(math.isnan(math.fmin(NAN, NNAN)))
+ self.assertTrue(math.isnan(math.fmin(NNAN, NAN)))
+
def testFrexp(self):
self.assertRaises(TypeError, math.frexp)