Commit 2d575662 authored by Guido van Rossum's avatar Guido van Rossum

Use pow() instead of repeated multiplication by 10 in round(x, n).

parent f3f6381a
...@@ -771,10 +771,9 @@ float_round(PyObject *v, PyObject *args) ...@@ -771,10 +771,9 @@ float_round(PyObject *v, PyObject *args)
{ {
#define UNDEF_NDIGITS (-0x7fffffff) /* Unlikely ndigits value */ #define UNDEF_NDIGITS (-0x7fffffff) /* Unlikely ndigits value */
double x; double x;
double f; double f = 1.0;
double flr, cil; double flr, cil;
double rounded; double rounded;
int i;
int ndigits = UNDEF_NDIGITS; int ndigits = UNDEF_NDIGITS;
if (!PyArg_ParseTuple(args, "|i", &ndigits)) if (!PyArg_ParseTuple(args, "|i", &ndigits))
...@@ -783,14 +782,8 @@ float_round(PyObject *v, PyObject *args) ...@@ -783,14 +782,8 @@ float_round(PyObject *v, PyObject *args)
x = PyFloat_AsDouble(v); x = PyFloat_AsDouble(v);
if (ndigits != UNDEF_NDIGITS) { if (ndigits != UNDEF_NDIGITS) {
f = 1.0; f = pow(10.0, ndigits);
i = abs(ndigits); x *= f;
while (--i >= 0)
f = f*10.0;
if (ndigits < 0)
x /= f;
else
x *= f;
} }
flr = floor(x); flr = floor(x);
...@@ -798,16 +791,13 @@ float_round(PyObject *v, PyObject *args) ...@@ -798,16 +791,13 @@ float_round(PyObject *v, PyObject *args)
if (x-flr > 0.5) if (x-flr > 0.5)
rounded = cil; rounded = cil;
else if (x-flr == 0.5) else if (x-flr == 0.5)
rounded = fmod(flr, 2) == 0 ? flr : cil; rounded = fmod(flr, 2) == 0 ? flr : cil;
else else
rounded = flr; rounded = flr;
if (ndigits != UNDEF_NDIGITS) { if (ndigits != UNDEF_NDIGITS) {
if (ndigits < 0) rounded /= f;
rounded *= f;
else
rounded /= f;
return PyFloat_FromDouble(rounded); return PyFloat_FromDouble(rounded);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment