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';
gotdig=1;
} else {
dc++;
- x[KMAX-1] |= c-'0';
+ if (c!='0') x[KMAX-3] |= 1;
}
}
if (lrp==-1) lrp=dc;
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;
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;
}
/* FIXME: find a way to compute optimal sh */
if (rp > 9+9*LD_B1B_DIG) sh = 9;
e2 += sh;
- for (k=a; k!=z; k=(k+1 & MASK)) {
+ for (i=0; (k=(a+i & MASK))!=z && i<LD_B1B_DIG+3; i++) {
uint32_t tmp = x[k] & (1<<sh)-1;
x[k] = (x[k]>>sh) + carry;
carry = (1000000000>>sh) * tmp;
if (k==a && !x[k]) {
a = (a+1 & MASK);
+ i--;
rp -= 9;
}
}
- if (carry) {
+ if (carry && k==z) {
if ((z+1 & MASK) != a) {
x[z] = carry;
z = (z+1 & MASK);