Просмотр исходного кода

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 8 лет назад
Родитель
Сommit
51ab6db4ed
1 измененных файлов с 2 добавлено и 1 удалено
  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;