Mercurial > cpython-lru_cache-weakref
comparison Python/bltinmodule.c @ 57164:bca027b6df53 2.6
Issue #7070: Fix problem with builtin round function for large odd
integer arguments. Also fixes the sign of round(-0.0).
| author | Mark Dickinson <dickinsm@gmail.com> |
|---|---|
| date | Mon, 09 Nov 2009 17:45:40 +0000 |
| parents | f65d62473465 |
| children | 2628216bc66d |
comparison
equal
deleted
inserted
replaced
| 57159:0eb56a8e6262 | 57164:bca027b6df53 |
|---|---|
| 2118 | 2118 |
| 2119 | 2119 |
| 2120 static PyObject * | 2120 static PyObject * |
| 2121 builtin_round(PyObject *self, PyObject *args, PyObject *kwds) | 2121 builtin_round(PyObject *self, PyObject *args, PyObject *kwds) |
| 2122 { | 2122 { |
| 2123 double number; | 2123 double number, abs_number, abs_result; |
| 2124 double f; | 2124 double f; |
| 2125 int ndigits = 0; | 2125 int ndigits = 0; |
| 2126 int i; | 2126 int i; |
| 2127 static char *kwlist[] = {"number", "ndigits", 0}; | 2127 static char *kwlist[] = {"number", "ndigits", 0}; |
| 2128 | 2128 |
| 2135 f = f*10.0; | 2135 f = f*10.0; |
| 2136 if (ndigits < 0) | 2136 if (ndigits < 0) |
| 2137 number /= f; | 2137 number /= f; |
| 2138 else | 2138 else |
| 2139 number *= f; | 2139 number *= f; |
| 2140 if (number >= 0.0) | 2140 |
| 2141 number = floor(number + 0.5); | 2141 /* round `number` to nearest integer, rounding halves away from zero */ |
| 2142 else | 2142 abs_number = fabs(number); |
| 2143 number = ceil(number - 0.5); | 2143 abs_result = floor(abs_number); |
| 2144 if (abs_number - abs_result >= 0.5) | |
| 2145 abs_result += 1.0; | |
| 2146 number = copysign(abs_result, number); | |
| 2147 | |
| 2144 if (ndigits < 0) | 2148 if (ndigits < 0) |
| 2145 number *= f; | 2149 number *= f; |
| 2146 else | 2150 else |
| 2147 number /= f; | 2151 number /= f; |
| 2148 return PyFloat_FromDouble(number); | 2152 return PyFloat_FromDouble(number); |
