diff options
Diffstat (limited to 'src/internal')
-rw-r--r-- | src/internal/floatscan.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/src/internal/floatscan.c b/src/internal/floatscan.c index d5444daa..6390d46a 100644 --- a/src/internal/floatscan.c +++ b/src/internal/floatscan.c @@ -77,7 +77,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po if (c == '.') { if (lrp!=-1) break; lrp = dc; - } else if (k < KMAX) { + } else if (k < KMAX-2) { dc++; if (j) x[k] = x[k]*10 + c-'0'; else x[k] = c-'0'; @@ -88,7 +88,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po gotdig=1; } else { dc++; - x[KMAX-1] |= c-'0'; + if (c!='0') x[KMAX-3] |= 1; } } if (lrp==-1) lrp=dc; @@ -146,7 +146,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po int rpm9 = rp>=0 ? rp%9 : rp%9+9; int p10 = p10s[rpm9-1]; uint32_t carry = 0; - for (k=a; k!=z; k=(k+1 & MASK)) { + for (k=a; k!=z; k++) { uint32_t tmp = x[k] % p10; x[k] = x[k]/p10 + carry; carry = 1000000000/p10 * tmp; @@ -155,12 +155,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po rp -= 9; } } - if (carry) { - if ((z+1 & MASK) != a) { - x[z] = carry; - z = (z+1 & MASK); - } else x[z-1 & MASK] |= 1; - } + if (carry) x[z++] = carry; rp += 9-rpm9; } |