Explorar el Código

fix float formatting of some exact halfway cases

in nearest rounding mode exact halfway cases were not following the
round to even rule if the rounding happened at a base 1000000000 digit
boundary of the internal representation and the previous digit was odd.

e.g. printf("%.0f", 1.5) printed 1 instead of 2.
Szabolcs Nagy hace 8 años
padre
commit
51ab6db4ed
Se han modificado 1 ficheros con 2 adiciones y 1 borrados
  1. 2 1
      src/stdio/vfprintf.c

+ 2 - 1
src/stdio/vfprintf.c

@@ -345,7 +345,8 @@ static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t)
 		if (x || d+1!=z) {
 			long double round = 2/LDBL_EPSILON;
 			long double small;
-			if (*d/i & 1) round += 2;
+			if ((*d/i & 1) || (i==1000000000 && d>a && (d[-1]&1)))
+				round += 2;
 			if (x<i/2) small=0x0.8p0;
 			else if (x==i/2 && d+1==z) small=0x1.0p0;
 			else small=0x1.8p0;