mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
Make math.floor and math.ceil return ints instead of floats.
This commit is contained in:
parent
d348b2587e
commit
c2155835b4
2 changed files with 21 additions and 6 deletions
|
@ -51,6 +51,7 @@ class MathTests(unittest.TestCase):
|
||||||
|
|
||||||
def testCeil(self):
|
def testCeil(self):
|
||||||
self.assertRaises(TypeError, math.ceil)
|
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(0.5)', math.ceil(0.5), 1)
|
||||||
self.ftest('ceil(1.0)', math.ceil(1.0), 1)
|
self.ftest('ceil(1.0)', math.ceil(1.0), 1)
|
||||||
self.ftest('ceil(1.5)', math.ceil(1.5), 2)
|
self.ftest('ceil(1.5)', math.ceil(1.5), 2)
|
||||||
|
@ -103,6 +104,7 @@ class MathTests(unittest.TestCase):
|
||||||
|
|
||||||
def testFloor(self):
|
def testFloor(self):
|
||||||
self.assertRaises(TypeError, math.floor)
|
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(0.5)', math.floor(0.5), 0)
|
||||||
self.ftest('floor(1.0)', math.floor(1.0), 1)
|
self.ftest('floor(1.0)', math.floor(1.0), 1)
|
||||||
self.ftest('floor(1.5)', math.floor(1.5), 1)
|
self.ftest('floor(1.5)', math.floor(1.5), 1)
|
||||||
|
|
|
@ -48,7 +48,8 @@ is_error(double x)
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
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);
|
double x = PyFloat_AsDouble(arg);
|
||||||
if (x == -1.0 && PyErr_Occurred())
|
if (x == -1.0 && PyErr_Occurred())
|
||||||
|
@ -61,7 +62,19 @@ math_1(PyObject *arg, double (*func) (double))
|
||||||
if (errno && is_error(x))
|
if (errno && is_error(x))
|
||||||
return NULL;
|
return NULL;
|
||||||
else
|
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 *
|
static PyObject *
|
||||||
|
@ -120,13 +133,13 @@ static PyObject * math_ceil(PyObject *self, PyObject *number) {
|
||||||
|
|
||||||
method = _PyType_Lookup(Py_TYPE(number), ceil_str);
|
method = _PyType_Lookup(Py_TYPE(number), ceil_str);
|
||||||
if (method == NULL)
|
if (method == NULL)
|
||||||
return math_1(number, ceil);
|
return math_1_to_int(number, ceil);
|
||||||
else
|
else
|
||||||
return PyObject_CallFunction(method, "O", number);
|
return PyObject_CallFunction(method, "O", number);
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(math_ceil_doc,
|
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.");
|
"This is the smallest integral value >= x.");
|
||||||
|
|
||||||
FUNC1(cos, cos,
|
FUNC1(cos, cos,
|
||||||
|
@ -160,13 +173,13 @@ static PyObject * math_floor(PyObject *self, PyObject *number) {
|
||||||
|
|
||||||
method = _PyType_Lookup(Py_TYPE(number), floor_str);
|
method = _PyType_Lookup(Py_TYPE(number), floor_str);
|
||||||
if (method == NULL)
|
if (method == NULL)
|
||||||
return math_1(number, floor);
|
return math_1_to_int(number, floor);
|
||||||
else
|
else
|
||||||
return PyObject_CallFunction(method, "O", number);
|
return PyObject_CallFunction(method, "O", number);
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(math_floor_doc,
|
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.");
|
"This is the largest integral value <= x.");
|
||||||
|
|
||||||
FUNC2(fmod, fmod,
|
FUNC2(fmod, fmod,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue