051-fix-float-formatting-of-some-exact-halfway-cases.patch 1.1 KB

123456789101112131415161718192021222324252627282930
  1. From 51ab6db4ed115d079d7131975e4adb074ba9ef9d Mon Sep 17 00:00:00 2001
  2. From: Szabolcs Nagy <[email protected]>
  3. Date: Wed, 12 Oct 2016 00:49:59 +0200
  4. Subject: fix float formatting of some exact halfway cases
  5. in nearest rounding mode exact halfway cases were not following the
  6. round to even rule if the rounding happened at a base 1000000000 digit
  7. boundary of the internal representation and the previous digit was odd.
  8. e.g. printf("%.0f", 1.5) printed 1 instead of 2.
  9. ---
  10. src/stdio/vfprintf.c | 3 ++-
  11. 1 file changed, 2 insertions(+), 1 deletion(-)
  12. diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
  13. index e2ab2dc..60da14d 100644
  14. --- a/src/stdio/vfprintf.c
  15. +++ b/src/stdio/vfprintf.c
  16. @@ -345,7 +345,8 @@ static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t)
  17. if (x || d+1!=z) {
  18. long double round = 2/LDBL_EPSILON;
  19. long double small;
  20. - if (*d/i & 1) round += 2;
  21. + if ((*d/i & 1) || (i==1000000000 && d>a && (d[-1]&1)))
  22. + round += 2;
  23. if (x<i/2) small=0x0.8p0;
  24. else if (x==i/2 && d+1==z) small=0x1.0p0;
  25. else small=0x1.8p0;
  26. --
  27. cgit v0.11.2