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