14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom __future__ import division
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# When true division is the default, get rid of this and add it to
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# test_long.py instead.  In the meantime, it's too obscure to try to
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# trick just part of test_long into using future division.
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport random
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport math
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_support import run_unittest
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# decorator for skipping tests on non-IEEE 754 platforms
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaorequires_IEEE_754 = unittest.skipUnless(
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    float.__getformat__("double").startswith("IEEE"),
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "test requires IEEE 754 doubles")
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
174adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDBL_MAX = sys.float_info.max
184adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDBL_MAX_EXP = sys.float_info.max_exp
194adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDBL_MIN_EXP = sys.float_info.min_exp
204adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDBL_MANT_DIG = sys.float_info.mant_dig
214adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDBL_MIN_OVERFLOW = 2**DBL_MAX_EXP - 2**(DBL_MAX_EXP - DBL_MANT_DIG - 1)
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# pure Python version of correctly-rounded true division
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef truediv(a, b):
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Correctly-rounded true division for integers."""
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    negative = a^b < 0
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    a, b = abs(a), abs(b)
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # exceptions:  division by zero, overflow
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not b:
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise ZeroDivisionError("division by zero")
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if a >= DBL_MIN_OVERFLOW * b:
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise OverflowError("int/int too large to represent as a float")
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao   # find integer d satisfying 2**(d - 1) <= a/b < 2**d
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    d = a.bit_length() - b.bit_length()
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if d >= 0 and a >= 2**d * b or d < 0 and a * 2**-d >= b:
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d += 1
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # compute 2**-exp * a / b for suitable exp
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    exp = max(d, DBL_MIN_EXP) - DBL_MANT_DIG
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    a, b = a << max(-exp, 0), b << max(exp, 0)
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    q, r = divmod(a, b)
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # round-half-to-even: fractional part is r/b, which is > 0.5 iff
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # 2*r > b, and == 0.5 iff 2*r == b.
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if 2*r > b or 2*r == b and q % 2 == 1:
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        q += 1
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    result = math.ldexp(float(q), exp)
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return -result if negative else result
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TrueDivisionTests(unittest.TestCase):
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test(self):
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        huge = 1L << 40000
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mhuge = -huge
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(huge / huge, 1.0)
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(mhuge / mhuge, 1.0)
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(huge / mhuge, -1.0)
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(mhuge / huge, -1.0)
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(1 / huge, 0.0)
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(1L / huge, 0.0)
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(1 / mhuge, 0.0)
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(1L / mhuge, 0.0)
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5)
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5)
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5)
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5)
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(huge / (huge << 1), 0.5)
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual((1000000 * huge) / huge, 1000000)
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        namespace = {'huge': huge, 'mhuge': mhuge}
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for overflow in ["float(huge)", "float(mhuge)",
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "huge / 1", "huge / 2L", "huge / -1", "huge / -2L",
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "mhuge / 100", "mhuge / 100L"]:
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # If the "eval" does not happen in this module,
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # true division is not enabled
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with self.assertRaises(OverflowError):
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                eval(overflow, namespace)
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for underflow in ["1 / huge", "2L / huge", "-1 / huge", "-2L / huge",
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "100 / mhuge", "100L / mhuge"]:
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            result = eval(underflow, namespace)
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(result, 0.0, 'expected underflow to 0 '
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             'from {!r}'.format(underflow))
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for zero in ["huge / 0", "huge / 0L", "mhuge / 0", "mhuge / 0L"]:
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with self.assertRaises(ZeroDivisionError):
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                eval(zero, namespace)
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def check_truediv(self, a, b, skip_small=True):
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Verify that the result of a/b is correctly rounded, by
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        comparing it with a pure Python implementation of correctly
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        rounded division.  b should be nonzero."""
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a, b = long(a), long(b)
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # skip check for small a and b: in this case, the current
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # implementation converts the arguments to float directly and
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # then applies a float division.  This can give doubly-rounded
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # results on x87-using machines (particularly 32-bit Linux).
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if skip_small and max(abs(a), abs(b)) < 2**DBL_MANT_DIG:
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # use repr so that we can distinguish between -0.0 and 0.0
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            expected = repr(truediv(a, b))
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except OverflowError:
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            expected = 'overflow'
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ZeroDivisionError:
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            expected = 'zerodivision'
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            got = repr(a / b)
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except OverflowError:
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            got = 'overflow'
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ZeroDivisionError:
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            got = 'zerodivision'
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(expected, got, "Incorrectly rounded division {}/{}: "
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "expected {}, got {}".format(a, b, expected, got))
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @requires_IEEE_754
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_correctly_rounded_true_division(self):
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # more stringent tests than those above, checking that the
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # result of true division of ints is always correctly rounded.
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This test should probably be considered CPython-specific.
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Exercise all the code paths not involving Gb-sized ints.
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ... divisions involving zero
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_truediv(123, 0)
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_truediv(-456, 0)
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_truediv(0, 3)
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_truediv(0, -3)
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_truediv(0, 0)
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ... overflow or underflow by large margin
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_truediv(671 * 12345 * 2**DBL_MAX_EXP, 12345)
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_truediv(12345, 345678 * 2**(DBL_MANT_DIG - DBL_MIN_EXP))
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ... a much larger or smaller than b
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_truediv(12345*2**100, 98765)
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_truediv(12345*2**30, 98765*7**81)
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ... a / b near a boundary: one of 1, 2**DBL_MANT_DIG, 2**DBL_MIN_EXP,
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #                 2**DBL_MAX_EXP, 2**(DBL_MIN_EXP-DBL_MANT_DIG)
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        bases = (0, DBL_MANT_DIG, DBL_MIN_EXP,
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 DBL_MAX_EXP, DBL_MIN_EXP - DBL_MANT_DIG)
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for base in bases:
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for exp in range(base - 15, base + 15):
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.check_truediv(75312*2**max(exp, 0), 69187*2**max(-exp, 0))
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.check_truediv(69187*2**max(exp, 0), 75312*2**max(-exp, 0))
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # overflow corner case
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for m in [1, 2, 7, 17, 12345, 7**100,
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                  -1, -2, -5, -23, -67891, -41**50]:
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for n in range(-10, 10):
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.check_truediv(m*DBL_MIN_OVERFLOW + n, m)
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.check_truediv(m*DBL_MIN_OVERFLOW + n, -m)
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check detection of inexactness in shifting stage
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for n in range(250):
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # (2**DBL_MANT_DIG+1)/(2**DBL_MANT_DIG) lies halfway
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # between two representable floats, and would usually be
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # rounded down under round-half-to-even.  The tiniest of
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # additions to the numerator should cause it to be rounded
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # up instead.
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.check_truediv((2**DBL_MANT_DIG + 1)*12345*2**200 + 2**n,
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           2**DBL_MANT_DIG*12345)
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # 1/2731 is one of the smallest division cases that's subject
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # to double rounding on IEEE 754 machines working internally with
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # 64-bit precision.  On such machines, the next check would fail,
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # were it not explicitly skipped in check_truediv.
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_truediv(1, 2731)
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # a particularly bad case for the old algorithm:  gives an
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # error of close to 3.5 ulps.
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_truediv(295147931372582273023, 295147932265116303360)
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in range(1000):
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.check_truediv(10**(i+1), 10**i)
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.check_truediv(10**i, 10**(i+1))
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test round-half-to-even behaviour, normal result
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for m in [1, 2, 4, 7, 8, 16, 17, 32, 12345, 7**100,
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                  -1, -2, -5, -23, -67891, -41**50]:
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for n in range(-10, 10):
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.check_truediv(2**DBL_MANT_DIG*m + n, m)
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test round-half-to-even, subnormal result
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for n in range(-20, 20):
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.check_truediv(n, 2**1076)
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # largeish random divisions: a/b where |a| <= |b| <=
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # 2*|a|; |ans| is between 0.5 and 1.0, so error should
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # always be bounded by 2**-54 with equality possible only
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # if the least significant bit of q=ans*2**53 is zero.
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for M in [10**10, 10**100, 10**1000]:
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for i in range(1000):
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                a = random.randrange(1, M)
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                b = random.randrange(a, 2*a+1)
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.check_truediv(a, b)
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.check_truediv(-a, b)
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.check_truediv(a, -b)
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.check_truediv(-a, -b)
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # and some (genuinely) random tests
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for _ in range(10000):
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            a_bits = random.randrange(1000)
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b_bits = random.randrange(1, 1000)
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x = random.randrange(2**a_bits)
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            y = random.randrange(1, 2**b_bits)
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.check_truediv(x, y)
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.check_truediv(x, -y)
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.check_truediv(-x, y)
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.check_truediv(-x, -y)
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    run_unittest(TrueDivisionTests)
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
222