diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2019-11-16 16:00:57 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-16 16:00:57 (GMT) |
commit | 5fd5cb8d85fab3393dd76c7f3de1cdeb8ecf7203 (patch) | |
tree | 99ac87736a8b6906bd7d4faeccd1a0d5cebfdb6e /Lib/test/test_math.py | |
parent | 51edf8aaa2e17626f9690ed29d25945fc03016b9 (diff) | |
download | cpython-5fd5cb8d85fab3393dd76c7f3de1cdeb8ecf7203.zip cpython-5fd5cb8d85fab3393dd76c7f3de1cdeb8ecf7203.tar.gz cpython-5fd5cb8d85fab3393dd76c7f3de1cdeb8ecf7203.tar.bz2 |
bpo-38639: Optimize floor(), ceil() and trunc() for floats. (GH-16991)
Diffstat (limited to 'Lib/test/test_math.py')
-rw-r--r-- | Lib/test/test_math.py | 61 |
1 files changed, 40 insertions, 21 deletions
diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index c237bc1..f832246 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -240,6 +240,13 @@ def result_check(expected, got, ulp_tol=5, abs_tol=0.0): else: return None +class FloatLike: + def __init__(self, value): + self.value = value + + def __float__(self): + return self.value + class IntSubclass(int): pass @@ -397,12 +404,14 @@ class MathTests(unittest.TestCase): def testCeil(self): self.assertRaises(TypeError, math.ceil) self.assertEqual(int, type(math.ceil(0.5))) - self.ftest('ceil(0.5)', math.ceil(0.5), 1) - self.ftest('ceil(1.0)', math.ceil(1.0), 1) - self.ftest('ceil(1.5)', math.ceil(1.5), 2) - self.ftest('ceil(-0.5)', math.ceil(-0.5), 0) - self.ftest('ceil(-1.0)', math.ceil(-1.0), -1) - self.ftest('ceil(-1.5)', math.ceil(-1.5), -1) + self.assertEqual(math.ceil(0.5), 1) + self.assertEqual(math.ceil(1.0), 1) + self.assertEqual(math.ceil(1.5), 2) + self.assertEqual(math.ceil(-0.5), 0) + self.assertEqual(math.ceil(-1.0), -1) + self.assertEqual(math.ceil(-1.5), -1) + self.assertEqual(math.ceil(0.0), 0) + self.assertEqual(math.ceil(-0.0), 0) #self.assertEqual(math.ceil(INF), INF) #self.assertEqual(math.ceil(NINF), NINF) #self.assertTrue(math.isnan(math.ceil(NAN))) @@ -410,9 +419,14 @@ class MathTests(unittest.TestCase): class TestCeil: def __ceil__(self): return 42 + class FloatCeil(float): + def __ceil__(self): + return 42 class TestNoCeil: pass - self.ftest('ceil(TestCeil())', math.ceil(TestCeil()), 42) + self.assertEqual(math.ceil(TestCeil()), 42) + self.assertEqual(math.ceil(FloatCeil()), 42) + self.assertEqual(math.ceil(FloatLike(42.5)), 43) self.assertRaises(TypeError, math.ceil, TestNoCeil()) t = TestNoCeil() @@ -536,16 +550,12 @@ class MathTests(unittest.TestCase): def testFloor(self): self.assertRaises(TypeError, math.floor) self.assertEqual(int, type(math.floor(0.5))) - self.ftest('floor(0.5)', math.floor(0.5), 0) - self.ftest('floor(1.0)', math.floor(1.0), 1) - self.ftest('floor(1.5)', math.floor(1.5), 1) - self.ftest('floor(-0.5)', math.floor(-0.5), -1) - self.ftest('floor(-1.0)', math.floor(-1.0), -1) - self.ftest('floor(-1.5)', math.floor(-1.5), -2) - # pow() relies on floor() to check for integers - # This fails on some platforms - so check it here - self.ftest('floor(1.23e167)', math.floor(1.23e167), 1.23e167) - self.ftest('floor(-1.23e167)', math.floor(-1.23e167), -1.23e167) + self.assertEqual(math.floor(0.5), 0) + self.assertEqual(math.floor(1.0), 1) + self.assertEqual(math.floor(1.5), 1) + self.assertEqual(math.floor(-0.5), -1) + self.assertEqual(math.floor(-1.0), -1) + self.assertEqual(math.floor(-1.5), -2) #self.assertEqual(math.ceil(INF), INF) #self.assertEqual(math.ceil(NINF), NINF) #self.assertTrue(math.isnan(math.floor(NAN))) @@ -553,9 +563,14 @@ class MathTests(unittest.TestCase): class TestFloor: def __floor__(self): return 42 + class FloatFloor(float): + def __floor__(self): + return 42 class TestNoFloor: pass - self.ftest('floor(TestFloor())', math.floor(TestFloor()), 42) + self.assertEqual(math.floor(TestFloor()), 42) + self.assertEqual(math.floor(FloatFloor()), 42) + self.assertEqual(math.floor(FloatLike(41.9)), 41) self.assertRaises(TypeError, math.floor, TestNoFloor()) t = TestNoFloor() @@ -1448,17 +1463,21 @@ class MathTests(unittest.TestCase): self.assertEqual(math.trunc(-0.999999), -0) self.assertEqual(math.trunc(-100.999), -100) - class TestTrunc(object): + class TestTrunc: def __trunc__(self): return 23 - - class TestNoTrunc(object): + class FloatTrunc(float): + def __trunc__(self): + return 23 + class TestNoTrunc: pass self.assertEqual(math.trunc(TestTrunc()), 23) + self.assertEqual(math.trunc(FloatTrunc()), 23) self.assertRaises(TypeError, math.trunc) self.assertRaises(TypeError, math.trunc, 1, 2) + self.assertRaises(TypeError, math.trunc, FloatLike(23.5)) self.assertRaises(TypeError, math.trunc, TestNoTrunc()) def testIsfinite(self): |