about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/internal/floatscan.c13
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;
 	}