浏览代码

fix float parsing logic for long decimal expansions

this affects at least the case of very long inputs, but may also
affect shorter inputs that become long due to growth while upscaling.
basically, the logic for the circular buffer indices of the initial
base-10^9 digit and the slot one past the final digit, and for
simplicity of the loop logic, assumes an invariant that they're not
equal. the upscale loop, which can increase the length of the
base-10^9 representation, attempted to preserve this invariant, but
was actually only ensuring that the end index did not loop around past
the start index, not that the two never become equal.

the main (only?) effect of this bug was that subsequent logic treats
the excessively long number as having no digits, leading to junk
results.
Rich Felker 12 年之前
父节点
当前提交
11458e5b09
共有 1 个文件被更改,包括 1 次插入1 次删除
  1. 1 1
      src/internal/floatscan.c

+ 1 - 1
src/internal/floatscan.c

@@ -199,11 +199,11 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po
 		}
 		if (carry) {
 			rp += 9;
+			a = (a-1 & MASK);
 			if (a == z) {
 				z = (z-1 & MASK);
 				x[z-1 & MASK] |= x[z];
 			}
-			a = (a-1 & MASK);
 			x[a] = carry;
 		}
 	}