054-fix-strtod-and-strtof-rounding-with-many-trailing-zeros.patch 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. From d184a09e0529f33d8ddddb8825039133483a2c41 Mon Sep 17 00:00:00 2001
  2. From: Szabolcs Nagy <[email protected]>
  3. Date: Sun, 4 Sep 2016 04:46:00 +0200
  4. Subject: fix strtod and strtof rounding with many trailing zeros
  5. in certain cases excessive trailing zeros could cause incorrect
  6. rounding from long double to double or float in decfloat.
  7. e.g. in strtof("9444733528689243848704.000000", 0) the argument
  8. is 0x1.000001p+73, exactly halfway between two representible floats,
  9. this incorrectly got rounded to 0x1.000002p+73 instead of 0x1p+73,
  10. but with less trailing 0 the rounding was fine.
  11. the fix makes sure that the z index always points one past the last
  12. non-zero digit in the base 10^9 representation, this way trailing
  13. zeros don't affect the rounding logic.
  14. ---
  15. src/internal/floatscan.c | 3 +++
  16. 1 file changed, 3 insertions(+)
  17. diff --git a/src/internal/floatscan.c b/src/internal/floatscan.c
  18. index eef70df..80305ee 100644
  19. --- a/src/internal/floatscan.c
  20. +++ b/src/internal/floatscan.c
  21. @@ -172,6 +172,9 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po
  22. return sign * (long double)x[0] * p10s[rp-10];
  23. }
  24. + /* Drop trailing zeros */
  25. + for (; !x[z-1]; z--);
  26. +
  27. /* Align radix point to B1B digit boundary */
  28. if (rp % 9) {
  29. int rpm9 = rp>=0 ? rp%9 : rp%9+9;
  30. --
  31. cgit v0.11.2