123456789101112131415161718192021222324252627282930 |
- From 51ab6db4ed115d079d7131975e4adb074ba9ef9d Mon Sep 17 00:00:00 2001
- From: Szabolcs Nagy <[email protected]>
- Date: Wed, 12 Oct 2016 00:49:59 +0200
- Subject: 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.
- ---
- src/stdio/vfprintf.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
- diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
- index e2ab2dc..60da14d 100644
- --- a/src/stdio/vfprintf.c
- +++ b/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;
- --
- cgit v0.11.2
|