diff options
Diffstat (limited to 'src')
| -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;  	}  | 
