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