diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2010-01-14 13:14:49 (GMT) |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2010-01-14 13:14:49 (GMT) |
commit | 50b60c612e7eca3f815d362190ddb80a21a6d820 (patch) | |
tree | fde501c830ddfd342940c53311da6be37f2b7110 /Python | |
parent | 03774fac622e35a4fa16901b0de181707effd930 (diff) | |
download | cpython-50b60c612e7eca3f815d362190ddb80a21a6d820.zip cpython-50b60c612e7eca3f815d362190ddb80a21a6d820.tar.gz cpython-50b60c612e7eca3f815d362190ddb80a21a6d820.tar.bz2 |
Issue 7632: fix a dtoa.c bug (bug 6) causing incorrect rounding. Tests to follow.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/dtoa.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/Python/dtoa.c b/Python/dtoa.c index 59833a0..5637c6c 100644 --- a/Python/dtoa.c +++ b/Python/dtoa.c @@ -1204,7 +1204,7 @@ static int bigcomp(U *rv, const char *s0, BCinfo *bc) { Bigint *b, *d; - int b2, bbits, d2, dd, i, nd, nd0, p2, p5; + int b2, bbits, d2, dd, i, nd, nd0, odd, p2, p5; dd = 0; /* silence compiler warning about possibly unused variable */ nd = bc->nd; @@ -1237,6 +1237,9 @@ bigcomp(U *rv, const char *s0, BCinfo *bc) b = lshift(b, ++i); if (b == NULL) return -1; + /* record whether the lsb of rv/2^(bc->scale) is odd: in the exact halfway + case, this is used for round to even. */ + odd = b->x[0] & 2; b->x[0] |= 1; p2 -= p5 + i; @@ -1291,7 +1294,7 @@ bigcomp(U *rv, const char *s0, BCinfo *bc) dd = -1; goto ret; } - + /* Compare b/d with s0 */ for(i = 0; i < nd0; i++) { b = multadd(b, 10, 0); @@ -1329,14 +1332,8 @@ bigcomp(U *rv, const char *s0, BCinfo *bc) ret: Bfree(b); Bfree(d); - if (dd > 0) + if (dd > 0 || (dd == 0 && odd)) dval(rv) += sulp(rv, bc); - else if (dd == 0) { - /* Exact half-way case: apply round-even rule. */ - if (word1(rv) & 1) - dval(rv) += sulp(rv, bc); - } - return 0; } |