fix float formatting of some exact halfway cases
authorSzabolcs Nagy <nsz@port70.net>
Tue, 11 Oct 2016 22:49:59 +0000 (00:49 +0200)
committerRich Felker <dalias@aerifal.cx>
Thu, 20 Oct 2016 05:54:15 +0000 (01:54 -0400)
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.

src/stdio/vfprintf.c

index e2ab2dc6efa756ac20d4a99ca3abddcfdb61b164..60da14d88a2da90871dbd8978315fbcd23a45f44 100644 (file)
@@ -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;