Author: Timo Paulssen <timona...@perpetuum-immobile.de> Branch: py3k-ceil-floor Changeset: r59062:351124282c1f Date: 2012-11-23 01:18 +0100 http://bitbucket.org/pypy/pypy/changeset/351124282c1f/
Log: do the same changes with math.floor, too. there are two commented lines in the test case. the one with negative values in it would fail, but I don't know why or how. diff --git a/pypy/module/math/interp_math.py b/pypy/module/math/interp_math.py --- a/pypy/module/math/interp_math.py +++ b/pypy/module/math/interp_math.py @@ -158,14 +158,26 @@ def floor(space, w_x): """floor(x) - Return the floor of x as a float. + Return the floor of x as an int. This is the largest integral value <= x. """ w_descr = space.lookup(w_x, '__floor__') if w_descr is not None: return space.get_and_call_function(w_descr, w_x) - x = _get_double(space, w_x) - return space.wrap(math.floor(x)) + w_floor_float_result = space.wrap(math.floor(space.float_w(w_x))) + return space.call_function(space.w_int, w_floor_float_result) + +def ceil(space, w_x): + """ceil(x) + + Return the ceiling of x as a float. + This is the smallest integral value >= x. + """ + w_descr = space.lookup(w_x, '__ceil__') + if w_descr is not None: + return space.get_and_call_function(w_descr, w_x) + w_ceil_float_result = space.wrap(math.ceil(space.float_w(w_x))) + return space.call_function(space.w_int, w_ceil_float_result) def sqrt(space, w_x): """sqrt(x) @@ -247,18 +259,6 @@ """ return math1(space, math.atan, w_x) -def ceil(space, w_x): - """ceil(x) - - Return the ceiling of x as a float. - This is the smallest integral value >= x. - """ - w_descr = space.lookup(w_x, '__ceil__') - if w_descr is not None: - return space.get_and_call_function(w_descr, w_x) - w_ceil_float_result = space.wrap(math.ceil(space.float_w(w_x))) - return space.call_function(space.w_int, w_ceil_float_result) - def sinh(space, w_x): """sinh(x) diff --git a/pypy/module/math/test/test_direct.py b/pypy/module/math/test/test_direct.py --- a/pypy/module/math/test/test_direct.py +++ b/pypy/module/math/test/test_direct.py @@ -21,7 +21,7 @@ unary_math_functions = ['acos', 'asin', 'atan', - 'cos', 'cosh', 'exp', 'fabs', 'floor', + 'cos', 'cosh', 'exp', 'fabs', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'log', 'log10', 'acosh', 'asinh', 'atanh', 'log1p', 'expm1'] binary_math_functions = ['atan2', 'fmod', 'hypot', 'pow'] @@ -94,8 +94,6 @@ ('exp', (-INFINITY,), 0.0), ('fabs', (INFINITY,), positiveinf), ('fabs', (-INFINITY,), positiveinf), - ('floor', (INFINITY,), positiveinf), - ('floor', (-INFINITY,), negativeinf), ('sin', (INFINITY,), ValueError), ('sin', (-INFINITY,), ValueError), ('sinh', (INFINITY,), positiveinf), diff --git a/pypy/module/math/test/test_math.py b/pypy/module/math/test/test_math.py --- a/pypy/module/math/test/test_math.py +++ b/pypy/module/math/test/test_math.py @@ -328,3 +328,45 @@ return "this is a string" assert math.ceil(StrangeCeil()) == "this is a string" + + def test_floor(self): + eps = 1E-05 + + def almost_equal(a, b): + return abs(a-b) <= eps + # adapted from the cpython test case + import math + raises(TypeError, math.floor) + assert type(math.floor(0.4)) is int + assert almost_equal(math.floor(0.5), 0) + assert almost_equal(math.floor(1.0), 1) + assert almost_equal(math.floor(1.5), 1) + assert almost_equal(math.floor(-0.5), -1) + assert almost_equal(math.floor(-1.0), -1) + assert almost_equal(math.floor(-1.5), -2) + #assert almost_equal(math.floor(1.23e167), 1.23e167) + #assert almost_equal(math.floor(-1.23e167), 1.23e167) + + class TestFloor: + def __floor__(self): + return 42 + class TestNoFloor: + pass + assert almost_equal(math.floor(TestFloor()), 42) + raises(TypeError, math.floor, TestNoFloor()) + + t = TestNoFloor() + t.__floor__ = lambda *args: args + raises(TypeError, math.floor, t) + raises(TypeError, math.floor, t, 0) + + # observed in a cpython interactive shell + raises(OverflowError, math.floor, float("inf")) + raises(OverflowError, math.floor, float("-inf")) + raises(ValueError, math.floor, float("nan")) + + class StrangeCeil: + def __floor__(self): + return "this is a string" + + assert math.floor(StrangeCeil()) == "this is a string" _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit