X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Finternal%2Ffloatscan.c;h=6390d46a1372089e41c82c0931a1eb7dd4058642;hb=5837a0bb6b5cf516f79527e837368af0b494d51a;hp=000706d72fe3c1a421f65f8886ef8e82ebeab176;hpb=38b3f1fea8fe4f2c590c1a9438d219291a7bfcd2;p=musl diff --git a/src/internal/floatscan.c b/src/internal/floatscan.c index 000706d7..6390d46a 100644 --- a/src/internal/floatscan.c +++ b/src/internal/floatscan.c @@ -52,7 +52,7 @@ static long long scanexp(FILE *f, int pok) } -static long double decfloat(FILE *f, int bits, int emin, int sign, int pok) +static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int pok) { uint32_t x[KMAX]; static const uint32_t th[] = { LD_B1B_MAX }; @@ -65,13 +65,10 @@ static long double decfloat(FILE *f, int bits, int emin, int sign, int pok) long double y; long double frac=0; long double bias=0; - int c; j=0; k=0; - c = shgetc(f); - /* Don't let leading zeros consume buffer space */ for (; c=='0'; c = shgetc(f)) gotdig=1; @@ -80,7 +77,7 @@ static long double decfloat(FILE *f, int bits, int emin, int sign, int pok) 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'; @@ -91,7 +88,7 @@ static long double decfloat(FILE *f, int bits, int emin, int sign, int pok) gotdig=1; } else { dc++; - x[KMAX-1] |= c-'0'; + if (c!='0') x[KMAX-3] |= 1; } } if (lrp==-1) lrp=dc; @@ -141,7 +138,28 @@ static long double decfloat(FILE *f, int bits, int emin, int sign, int pok) e2 = 0; rp = lrp; - while (rp < 18+9*LD_B1B_DIG) { + if (rp % 9) { + static const int p10s[] = { + 100000000, 10000000, 1000000, 100000, + 10000, 1000, 100, 10 + }; + int rpm9 = rp>=0 ? rp%9 : rp%9+9; + int p10 = p10s[rpm9-1]; + uint32_t carry = 0; + for (k=a; k!=z; k++) { + uint32_t tmp = x[k] % p10; + x[k] = x[k]/p10 + carry; + carry = 1000000000/p10 * tmp; + if (k==a && !x[k]) { + a = (a+1 & MASK); + rp -= 9; + } + } + if (carry) x[z++] = carry; + rp += 9-rpm9; + } + + while (rp < 9*LD_B1B_DIG || (rp == 9*LD_B1B_DIG && x[0]