]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Make math.floor and math.ceil return ints instead of floats.
authorJeffrey Yasskin <jyasskin@gmail.com>
Sat, 5 Jan 2008 20:03:11 +0000 (20:03 +0000)
committerJeffrey Yasskin <jyasskin@gmail.com>
Sat, 5 Jan 2008 20:03:11 +0000 (20:03 +0000)
Lib/test/test_math.py
Modules/mathmodule.c

index 8449794cc457999aedd3d00977ba7fdf052baa45..233339224f70162ddbe02b7576a3f228da80f885 100644 (file)
@@ -51,6 +51,7 @@ class MathTests(unittest.TestCase):
 
     def testCeil(self):
         self.assertRaises(TypeError, math.ceil)
+        self.assertEquals(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)
@@ -103,6 +104,7 @@ class MathTests(unittest.TestCase):
 
     def testFloor(self):
         self.assertRaises(TypeError, math.floor)
+        self.assertEquals(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)
index 62f9f0b5bf62567843d2a1c6a400ff9ea062f06a..b773f706e602e95f99fa5d20ed6705b664c4d1c8 100644 (file)
@@ -48,7 +48,8 @@ is_error(double x)
 }
 
 static PyObject *
-math_1(PyObject *arg, double (*func) (double))
+math_1_to_whatever(PyObject *arg, double (*func) (double),
+                   PyObject *(*from_double_func) (double))
 {
        double x = PyFloat_AsDouble(arg);
        if (x == -1.0 && PyErr_Occurred())
@@ -61,7 +62,19 @@ math_1(PyObject *arg, double (*func) (double))
        if (errno && is_error(x))
                return NULL;
        else
-               return PyFloat_FromDouble(x);
+               return (*from_double_func)(x);
+}
+
+static PyObject *
+math_1(PyObject *arg, double (*func) (double))
+{
+       return math_1_to_whatever(arg, func, PyFloat_FromDouble);
+}
+
+static PyObject *
+math_1_to_int(PyObject *arg, double (*func) (double))
+{
+       return math_1_to_whatever(arg, func, PyLong_FromDouble);
 }
 
 static PyObject *
@@ -120,13 +133,13 @@ static PyObject * math_ceil(PyObject *self, PyObject *number) {
 
        method = _PyType_Lookup(Py_TYPE(number), ceil_str);
        if (method == NULL)
-               return math_1(number, ceil);
+               return math_1_to_int(number, ceil);
        else
                return PyObject_CallFunction(method, "O", number);
 }
 
 PyDoc_STRVAR(math_ceil_doc,
-            "ceil(x)\n\nReturn the ceiling of x as a float.\n"
+            "ceil(x)\n\nReturn the ceiling of x as an int.\n"
             "This is the smallest integral value >= x.");
 
 FUNC1(cos, cos,
@@ -160,13 +173,13 @@ static PyObject * math_floor(PyObject *self, PyObject *number) {
 
        method = _PyType_Lookup(Py_TYPE(number), floor_str);
        if (method == NULL)
-               return math_1(number, floor);
+               return math_1_to_int(number, floor);
        else
                return PyObject_CallFunction(method, "O", number);
 }
 
 PyDoc_STRVAR(math_floor_doc,
-            "floor(x)\n\nReturn the floor of x as a float.\n"
+            "floor(x)\n\nReturn the floor of x as an int.\n"
             "This is the largest integral value <= x.");
 
 FUNC2(fmod, fmod,