fix float scanning of certain values ending in zeros
authorRich Felker <dalias@aerifal.cx>
Wed, 11 Apr 2012 03:41:54 +0000 (23:41 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 11 Apr 2012 03:41:54 +0000 (23:41 -0400)
for example, "1000000000" was being read as "1" due to this loop
exiting early. it's necessary to actually update z and zero the
entries so that the subsequent rounding code does not get confused;
before i did that, spurious inexact exceptions were being raised.

src/internal/floatscan.c

index ed73527867322217f8932f630e5084721dfee18a..000706d72fe3c1a421f65f8886ef8e82ebeab176 100644 (file)
@@ -225,8 +225,10 @@ static long double decfloat(FILE *f, int bits, int emin, int sign, int pok)
                }
        }
 
-       for (y=i=0; i<LD_B1B_DIG && (a+i & MASK)!=z; i++)
+       for (y=i=0; i<LD_B1B_DIG; i++) {
+               if ((a+i & MASK)==z) x[z=(z+1 & MASK)] = 0;
                y = 1000000000.0L * y + x[a+i & MASK];
+       }
 
        y *= sign;