diff Python/bltinmodule.c @ 8287:d3bf3c2ad75a legacy-trunk

Implement round() slightly different, so that for negative ndigits no additional errors happen in the last step. The trick is to avoid division by 0.1**n -- multiply by 10.0**n instead.
author Guido van Rossum <guido@python.org>
date Sat, 09 May 1998 14:42:25 +0000
parents 9d0310143600
children 0cb0394c2edc
line wrap: on
line diff
--- a/Python/bltinmodule.c	Fri May 08 21:52:55 1998 +0000
+++ b/Python/bltinmodule.c	Sat May 09 14:42:25 1998 +0000
@@ -1488,14 +1488,22 @@
 	if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
 			return NULL;
 	f = 1.0;
-	for (i = ndigits; --i >= 0; )
+	i = abs(ndigits);
+	while  (--i >= 0)
 		f = f*10.0;
-	for (i = ndigits; ++i <= 0; )
-		f = f*0.1;
+	if (ndigits < 0)
+		x /= f;
+	else
+		x *= f;
 	if (x >= 0.0)
-		return PyFloat_FromDouble(floor(x*f + 0.5) / f);
+		x = floor(x + 0.5);
 	else
-		return PyFloat_FromDouble(ceil(x*f - 0.5) / f);
+		x = ceil(x - 0.5);
+	if (ndigits < 0)
+		x *= f;
+	else
+		x /= f;
+	return PyFloat_FromDouble(x);
 }
 
 static PyObject *