Mercurial > cpython-lru_cache-weakref
diff Python/dtoa.c @ 58317:76fb7dbd7388 legacy-trunk
Issue 7632: fix a dtoa.c bug (bug 6) causing incorrect rounding. Tests to follow.
| author | Mark Dickinson <dickinsm@gmail.com> |
|---|---|
| date | Thu, 14 Jan 2010 13:14:49 +0000 |
| parents | af1809813de9 |
| children | 92384d7f425a |
line wrap: on
line diff
--- a/Python/dtoa.c Thu Jan 14 13:02:36 2010 +0000 +++ b/Python/dtoa.c Thu Jan 14 13:14:49 2010 +0000 @@ -1204,7 +1204,7 @@ 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 @@ 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 @@ dd = -1; goto ret; } - + /* Compare b/d with s0 */ for(i = 0; i < nd0; i++) { b = multadd(b, 10, 0); @@ -1329,14 +1332,8 @@ 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; }
