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);