[pypy-svn] pypy default: Fix the new _bigint_true_divide() too.
arigo
commits-noreply at bitbucket.org
Sun Feb 6 13:48:03 CET 2011
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r41650:946bfdb56371
Date: 2011-02-06 12:59 +0100
http://bitbucket.org/pypy/pypy/changeset/946bfdb56371/
Log: Fix the new _bigint_true_divide() too.
diff --git a/pypy/rlib/rbigint.py b/pypy/rlib/rbigint.py
--- a/pypy/rlib/rbigint.py
+++ b/pypy/rlib/rbigint.py
@@ -1409,8 +1409,8 @@
if not a.tobool():
return _truediv_result(0.0, negate)
- a_size = a._numdigits()
- b_size = b._numdigits()
+ a_size = a.numdigits()
+ b_size = b.numdigits()
# Fast path for a and b small (exactly representable in a double).
# Relies on floating-point division being correctly rounded; results
@@ -1418,24 +1418,24 @@
# the x87 FPU set to 64-bit precision.
a_is_small = (a_size <= MANT_DIG_DIGITS or
(a_size == MANT_DIG_DIGITS+1 and
- a.digits[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0))
+ a.digit(MANT_DIG_DIGITS) >> MANT_DIG_BITS == 0))
b_is_small = (b_size <= MANT_DIG_DIGITS or
(b_size == MANT_DIG_DIGITS+1 and
- b.digits[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0))
+ b.digit(MANT_DIG_DIGITS) >> MANT_DIG_BITS == 0))
if a_is_small and b_is_small:
a_size -= 1
- da = float(a.digits[a_size])
+ da = float(a.digit(a_size))
while True:
a_size -= 1
if a_size < 0: break
- da = da * BASE_AS_FLOAT + a.digits[a_size]
+ da = da * BASE_AS_FLOAT + a.digit(a_size)
b_size -= 1
- db = float(b.digits[b_size])
+ db = float(b.digit(b_size))
while True:
b_size -= 1
if b_size < 0: break
- db = db * BASE_AS_FLOAT + b.digits[b_size]
+ db = db * BASE_AS_FLOAT + b.digit(b_size)
return _truediv_result(da / db, negate)
@@ -1446,8 +1446,8 @@
elif diff < 1 - sys.maxint/SHIFT:
return _truediv_result(0.0, negate) # Extreme underflow
# Next line is now safe from overflowing integers
- diff = (diff * SHIFT + bits_in_digit(a.digits[a_size - 1]) -
- bits_in_digit(b.digits[b_size - 1]))
+ diff = (diff * SHIFT + bits_in_digit(a.digit(a_size - 1)) -
+ bits_in_digit(b.digit(b_size - 1)))
# Now diff = a_bits - b_bits.
if diff > DBL_MAX_EXP:
return _truediv_overflow()
@@ -1474,8 +1474,8 @@
inexact = True
assert x.tobool() # result of division is never zero
- x_size = x._numdigits()
- x_bits = (x_size-1)*SHIFT + bits_in_digit(x.digits[x_size-1])
+ x_size = x.numdigits()
+ x_bits = (x_size-1)*SHIFT + bits_in_digit(x.digit(x_size-1))
# The number of extra bits that have to be rounded away.
extra_bits = max(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG
@@ -1483,7 +1483,7 @@
# Round by remembering a modified copy of the low digit of x
mask = 1 << (extra_bits - 1)
- low = x.digits[0] | inexact
+ low = x.digit(0) | inexact
if (low & mask) != 0 and (low & (3*mask-1)) != 0:
low += mask
x_digit_0 = low & ~(mask-1)
@@ -1492,7 +1492,7 @@
x_size -= 1
dx = 0.0
while x_size > 0:
- dx += x.digits[x_size]
+ dx += x.digit(x_size)
dx *= BASE_AS_FLOAT
x_size -= 1
dx += x_digit_0
More information about the Pypy-commit
mailing list