summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_math.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2019-11-16 16:00:57 (GMT)
committerGitHub <noreply@github.com>2019-11-16 16:00:57 (GMT)
commit5fd5cb8d85fab3393dd76c7f3de1cdeb8ecf7203 (patch)
tree99ac87736a8b6906bd7d4faeccd1a0d5cebfdb6e /Lib/test/test_math.py
parent51edf8aaa2e17626f9690ed29d25945fc03016b9 (diff)
downloadcpython-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.py61
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):