14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Python test set -- math module
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# XXXX Should not do tests around zero only
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_support import run_unittest, verbose
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport math
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport random
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport struct
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoeps = 1E-05
134adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoNAN = float('nan')
144adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoINF = float('inf')
154adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoNINF = float('-inf')
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# decorator for skipping tests on non-IEEE 754 platforms
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaorequires_IEEE_754 = unittest.skipUnless(
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    float.__getformat__("double").startswith("IEEE"),
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "test requires IEEE 754 doubles")
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# detect evidence of double-rounding: fsum is not always correctly
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# rounded on machines that suffer from double rounding.
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaox, y = 1e16, 2.9999 # use temporary values to defeat peephole optimizer
254adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoHAVE_DOUBLE_ROUNDING = (x + y == 1e16 + 4)
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# locate file with test values
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == '__main__':
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file = sys.argv[0]
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelse:
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file = __file__
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotest_dir = os.path.dirname(file) or os.curdir
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaomath_testcases = os.path.join(test_dir, 'math_testcases.txt')
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotest_file = os.path.join(test_dir, 'cmath_testcases.txt')
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef to_ulps(x):
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Convert a non-NaN float x to an integer, in such a way that
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    adjacent floats are converted to adjacent integers.  Then
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    abs(ulps(x) - ulps(y)) gives the difference in ulps between two
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    floats.
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The results from this function will only make sense on platforms
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    where C doubles are represented in IEEE 754 binary64 format.
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    n = struct.unpack('<q', struct.pack('<d', x))[0]
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if n < 0:
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n = ~(n+2**63)
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return n
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef ulps_check(expected, got, ulps=20):
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Given non-NaN floats `expected` and `got`,
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    check that they're equal to within the given number of ulps.
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns None on success and an error message on failure."""
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ulps_error = to_ulps(got) - to_ulps(expected)
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if abs(ulps_error) <= ulps:
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return None
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return "error = {} ulps; permitted error = {} ulps".format(ulps_error,
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                               ulps)
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef acc_check(expected, got, rel_err=2e-15, abs_err = 5e-323):
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Determine whether non-NaN floats a and b are equal to within a
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (small) rounding error.  The default values for rel_err and
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    abs_err are chosen to be suitable for platforms where a float is
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    represented by an IEEE 754 double.  They allow an error of between
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    9 and 19 ulps."""
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # need to special case infinities, since inf - inf gives nan
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if math.isinf(expected) and got == expected:
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return None
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    error = got - expected
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    permitted_error = max(abs_err, rel_err * abs(expected))
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if abs(error) < permitted_error:
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return None
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return "error = {}; permitted error = {}".format(error,
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                     permitted_error)
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef parse_mtestfile(fname):
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Parse a file with test values
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    -- starts a comment
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    blank lines, or lines containing only a comment, are ignored
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    other lines are expected to have the form
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      id fn arg -> expected [flag]*
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    with open(fname) as fp:
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for line in fp:
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # strip comments, and skip blank lines
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if '--' in line:
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                line = line[:line.index('--')]
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not line.strip():
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            lhs, rhs = line.split('->')
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            id, fn, arg = lhs.split()
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            rhs_pieces = rhs.split()
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            exp = rhs_pieces[0]
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            flags = rhs_pieces[1:]
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            yield (id, fn, float(arg), float(exp), flags)
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef parse_testfile(fname):
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Parse a file with test values
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Empty lines or lines starting with -- are ignored
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    yields id, fn, arg_real, arg_imag, exp_real, exp_imag
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    with open(fname) as fp:
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for line in fp:
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # skip comment lines and blank lines
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if line.startswith('--') or not line.strip():
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            lhs, rhs = line.split('->')
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            id, fn, arg_real, arg_imag = lhs.split()
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            rhs_pieces = rhs.split()
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            exp_real, exp_imag = rhs_pieces[0], rhs_pieces[1]
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            flags = rhs_pieces[2:]
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            yield (id, fn,
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                   float(arg_real), float(arg_imag),
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                   float(exp_real), float(exp_imag),
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                   flags
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                  )
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MathTests(unittest.TestCase):
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def ftest(self, name, value, expected):
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if abs(value-expected) > eps:
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Use %r instead of %f so the error message
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # displays full precision. Otherwise discrepancies
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # in the last few bits will lead to very confusing
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # error messages
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail('%s returned %r, expected %r' %
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      (name, value, expected))
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testConstants(self):
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('pi', math.pi, 3.1415926)
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('e', math.e, 2.7182818)
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAcos(self):
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.acos)
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('acos(-1)', math.acos(-1), math.pi)
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('acos(0)', math.acos(0), math.pi/2)
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('acos(1)', math.acos(1), 0)
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.acos, INF)
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.acos, NINF)
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.acos(NAN)))
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAcosh(self):
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.acosh)
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('acosh(1)', math.acosh(1), 0)
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('acosh(2)', math.acosh(2), 1.3169578969248168)
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.acosh, 0)
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.acosh, -1)
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.acosh(INF), INF)
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.acosh, NINF)
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.acosh(NAN)))
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAsin(self):
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.asin)
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('asin(-1)', math.asin(-1), -math.pi/2)
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('asin(0)', math.asin(0), 0)
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('asin(1)', math.asin(1), math.pi/2)
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.asin, INF)
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.asin, NINF)
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.asin(NAN)))
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAsinh(self):
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.asinh)
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('asinh(0)', math.asinh(0), 0)
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('asinh(1)', math.asinh(1), 0.88137358701954305)
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('asinh(-1)', math.asinh(-1), -0.88137358701954305)
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.asinh(INF), INF)
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.asinh(NINF), NINF)
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.asinh(NAN)))
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAtan(self):
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.atan)
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan(-1)', math.atan(-1), -math.pi/4)
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan(0)', math.atan(0), 0)
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan(1)', math.atan(1), math.pi/4)
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan(inf)', math.atan(INF), math.pi/2)
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan(-inf)', math.atan(NINF), -math.pi/2)
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan(NAN)))
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAtanh(self):
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.atan)
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atanh(0)', math.atanh(0), 0)
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atanh(0.5)', math.atanh(0.5), 0.54930614433405489)
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atanh(-0.5)', math.atanh(-0.5), -0.54930614433405489)
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.atanh, 1)
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.atanh, -1)
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.atanh, INF)
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.atanh, NINF)
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atanh(NAN)))
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAtan2(self):
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.atan2)
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-1, 0)', math.atan2(-1, 0), -math.pi/2)
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-1, 1)', math.atan2(-1, 1), -math.pi/4)
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(0, 1)', math.atan2(0, 1), 0)
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(1, 1)', math.atan2(1, 1), math.pi/4)
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(1, 0)', math.atan2(1, 0), math.pi/2)
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # math.atan2(0, x)
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(0., -inf)', math.atan2(0., NINF), math.pi)
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(0., -2.3)', math.atan2(0., -2.3), math.pi)
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(0., -0.)', math.atan2(0., -0.), math.pi)
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.atan2(0., 0.), 0.)
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.atan2(0., 2.3), 0.)
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.atan2(0., INF), 0.)
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(0., NAN)))
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # math.atan2(-0, x)
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-0., -inf)', math.atan2(-0., NINF), -math.pi)
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-0., -2.3)', math.atan2(-0., -2.3), -math.pi)
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-0., -0.)', math.atan2(-0., -0.), -math.pi)
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.atan2(-0., 0.), -0.)
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.atan2(-0., 2.3), -0.)
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.atan2(-0., INF), -0.)
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(-0., NAN)))
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # math.atan2(INF, x)
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(inf, -inf)', math.atan2(INF, NINF), math.pi*3/4)
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(inf, -2.3)', math.atan2(INF, -2.3), math.pi/2)
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(inf, -0.)', math.atan2(INF, -0.0), math.pi/2)
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(inf, 0.)', math.atan2(INF, 0.0), math.pi/2)
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(inf, 2.3)', math.atan2(INF, 2.3), math.pi/2)
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(inf, inf)', math.atan2(INF, INF), math.pi/4)
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(INF, NAN)))
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # math.atan2(NINF, x)
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-inf, -inf)', math.atan2(NINF, NINF), -math.pi*3/4)
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-inf, -2.3)', math.atan2(NINF, -2.3), -math.pi/2)
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-inf, -0.)', math.atan2(NINF, -0.0), -math.pi/2)
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-inf, 0.)', math.atan2(NINF, 0.0), -math.pi/2)
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-inf, 2.3)', math.atan2(NINF, 2.3), -math.pi/2)
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-inf, inf)', math.atan2(NINF, INF), -math.pi/4)
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(NINF, NAN)))
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # math.atan2(+finite, x)
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(2.3, -inf)', math.atan2(2.3, NINF), math.pi)
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(2.3, -0.)', math.atan2(2.3, -0.), math.pi/2)
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(2.3, 0.)', math.atan2(2.3, 0.), math.pi/2)
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.atan2(2.3, INF), 0.)
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(2.3, NAN)))
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # math.atan2(-finite, x)
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-2.3, -inf)', math.atan2(-2.3, NINF), -math.pi)
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-2.3, -0.)', math.atan2(-2.3, -0.), -math.pi/2)
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('atan2(-2.3, 0.)', math.atan2(-2.3, 0.), -math.pi/2)
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.atan2(-2.3, INF), -0.)
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(-2.3, NAN)))
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # math.atan2(NAN, x)
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(NAN, NINF)))
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(NAN, -2.3)))
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(NAN, -0.)))
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(NAN, 0.)))
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(NAN, 2.3)))
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(NAN, INF)))
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.atan2(NAN, NAN)))
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testCeil(self):
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.ceil)
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # These types will be int in py3k.
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(float, type(math.ceil(1)))
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(float, type(math.ceil(1L)))
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(float, type(math.ceil(1.0)))
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('ceil(0.5)', math.ceil(0.5), 1)
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('ceil(1.0)', math.ceil(1.0), 1)
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('ceil(1.5)', math.ceil(1.5), 2)
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('ceil(-0.5)', math.ceil(-0.5), 0)
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('ceil(-1.0)', math.ceil(-1.0), -1)
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('ceil(-1.5)', math.ceil(-1.5), -1)
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.ceil(INF), INF)
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.ceil(NINF), NINF)
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.ceil(NAN)))
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class TestCeil(object):
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __float__(self):
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 41.3
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class TestNoCeil(object):
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('ceil(TestCeil())', math.ceil(TestCeil()), 42)
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.ceil, TestNoCeil())
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t = TestNoCeil()
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t.__ceil__ = lambda *args: args
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.ceil, t)
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.ceil, t, 0)
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @requires_IEEE_754
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testCopysign(self):
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(1, 42), 1.0)
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(0., 42), 0.0)
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(1., -42), -1.0)
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(3, 0.), 3.0)
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(4., -0.), -4.0)
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.copysign)
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # copysign should let us distinguish signs of zeros
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(1., 0.), 1.)
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(1., -0.), -1.)
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(INF, 0.), INF)
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(INF, -0.), NINF)
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(NINF, 0.), INF)
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(NINF, -0.), NINF)
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # and of infinities
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(1., INF), 1.)
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(1., NINF), -1.)
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(INF, INF), INF)
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(INF, NINF), NINF)
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(NINF, INF), INF)
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.copysign(NINF, NINF), NINF)
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.copysign(NAN, 1.)))
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.copysign(NAN, INF)))
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.copysign(NAN, NINF)))
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.copysign(NAN, NAN)))
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # copysign(INF, NAN) may be INF or it may be NINF, since
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # we don't know whether the sign bit of NAN is set on any
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # given platform.
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isinf(math.copysign(INF, NAN)))
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # similarly, copysign(2., NAN) could be 2. or -2.
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(abs(math.copysign(2., NAN)), 2.)
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testCos(self):
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.cos)
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('cos(-pi/2)', math.cos(-math.pi/2), 0)
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('cos(0)', math.cos(0), 1)
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('cos(pi/2)', math.cos(math.pi/2), 0)
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('cos(pi)', math.cos(math.pi), -1)
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(math.isnan(math.cos(INF)))
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(math.isnan(math.cos(NINF)))
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(ValueError, math.cos, INF)
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(ValueError, math.cos, NINF)
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.cos(NAN)))
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testCosh(self):
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.cosh)
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('cosh(0)', math.cosh(0), 1)
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('cosh(2)-2*cosh(1)**2', math.cosh(2)-2*math.cosh(1)**2, -1) # Thanks to Lambert
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.cosh(INF), INF)
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.cosh(NINF), INF)
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.cosh(NAN)))
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testDegrees(self):
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.degrees)
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('degrees(pi)', math.degrees(math.pi), 180.0)
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('degrees(pi/2)', math.degrees(math.pi/2), 90.0)
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('degrees(-pi/4)', math.degrees(-math.pi/4), -45.0)
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testExp(self):
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.exp)
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('exp(-1)', math.exp(-1), 1/math.e)
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('exp(0)', math.exp(0), 1)
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('exp(1)', math.exp(1), math.e)
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.exp(INF), INF)
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.exp(NINF), 0.)
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.exp(NAN)))
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testFabs(self):
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.fabs)
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('fabs(-1)', math.fabs(-1), 1)
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('fabs(0)', math.fabs(0), 0)
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('fabs(1)', math.fabs(1), 1)
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testFactorial(self):
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def fact(n):
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            result = 1
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for i in range(1, int(n)+1):
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                result *= i
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return result
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        values = range(10) + [50, 100, 500]
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        random.shuffle(values)
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for x in values:
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for cast in (int, long, float):
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(math.factorial(cast(x)), fact(x), (x, fact(x), math.factorial(x)))
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.factorial, -1)
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.factorial, math.pi)
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testFloor(self):
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.floor)
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # These types will be int in py3k.
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(float, type(math.floor(1)))
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(float, type(math.floor(1L)))
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(float, type(math.floor(1.0)))
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('floor(0.5)', math.floor(0.5), 0)
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('floor(1.0)', math.floor(1.0), 1)
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('floor(1.5)', math.floor(1.5), 1)
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('floor(-0.5)', math.floor(-0.5), -1)
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('floor(-1.0)', math.floor(-1.0), -1)
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('floor(-1.5)', math.floor(-1.5), -2)
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow() relies on floor() to check for integers
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This fails on some platforms - so check it here
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('floor(1.23e167)', math.floor(1.23e167), 1.23e167)
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('floor(-1.23e167)', math.floor(-1.23e167), -1.23e167)
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.ceil(INF), INF)
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.ceil(NINF), NINF)
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.floor(NAN)))
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class TestFloor(object):
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __float__(self):
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 42.3
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class TestNoFloor(object):
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('floor(TestFloor())', math.floor(TestFloor()), 42)
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.floor, TestNoFloor())
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t = TestNoFloor()
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t.__floor__ = lambda *args: args
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.floor, t)
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.floor, t, 0)
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testFmod(self):
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.fmod)
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('fmod(10,1)', math.fmod(10,1), 0)
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('fmod(10,0.5)', math.fmod(10,0.5), 0)
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('fmod(10,1.5)', math.fmod(10,1.5), 1)
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('fmod(-10,1)', math.fmod(-10,1), 0)
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('fmod(-10,0.5)', math.fmod(-10,0.5), 0)
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('fmod(-10,1.5)', math.fmod(-10,1.5), -1)
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.fmod(NAN, 1.)))
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.fmod(1., NAN)))
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.fmod(NAN, NAN)))
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.fmod, 1., 0.)
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.fmod, INF, 1.)
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.fmod, NINF, 1.)
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.fmod, INF, 0.)
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.fmod(3.0, INF), 3.0)
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.fmod(-3.0, INF), -3.0)
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.fmod(3.0, NINF), 3.0)
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.fmod(-3.0, NINF), -3.0)
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.fmod(0.0, 3.0), 0.0)
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.fmod(0.0, NINF), 0.0)
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testFrexp(self):
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.frexp)
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def testfrexp(name, result, expected):
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (mant, exp), (emant, eexp) = result, expected
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if abs(mant-emant) > eps or exp != eexp:
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail('%s returned %r, expected %r'%\
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          (name, (mant, exp), (emant,eexp)))
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testfrexp('frexp(-1)', math.frexp(-1), (-0.5, 1))
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testfrexp('frexp(0)', math.frexp(0), (0, 0))
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testfrexp('frexp(1)', math.frexp(1), (0.5, 1))
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testfrexp('frexp(2)', math.frexp(2), (0.5, 2))
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.frexp(INF)[0], INF)
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.frexp(NINF)[0], NINF)
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.frexp(NAN)[0]))
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @requires_IEEE_754
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @unittest.skipIf(HAVE_DOUBLE_ROUNDING,
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "fsum is not exact on machines with double rounding")
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testFsum(self):
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # math.fsum relies on exact rounding for correct operation.
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # There's a known problem with IA32 floating-point that causes
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # inexact rounding in some situations, and will cause the
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # math.fsum tests below to fail; see issue #2937.  On non IEEE
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # 754 platforms, and on IEEE 754 platforms that exhibit the
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # problem described in issue #2937, we simply skip the whole
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test.
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Python version of math.fsum, for comparison.  Uses a
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # different algorithm based on frexp, ldexp and integer
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # arithmetic.
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from sys import float_info
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mant_dig = float_info.mant_dig
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        etiny = float_info.min_exp - mant_dig
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def msum(iterable):
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """Full precision summation.  Compute sum(iterable) without any
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            intermediate accumulation of error.  Based on the 'lsum' function
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            at http://code.activestate.com/recipes/393090/
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            """
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            tmant, texp = 0, 0
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for x in iterable:
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                mant, exp = math.frexp(x)
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                mant, exp = int(math.ldexp(mant, mant_dig)), exp - mant_dig
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if texp > exp:
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    tmant <<= texp-exp
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    texp = exp
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    mant <<= exp-texp
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                tmant += mant
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Round tmant * 2**texp to a float.  The original recipe
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # used float(str(tmant)) * 2.0**texp for this, but that's
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # a little unsafe because str -> float conversion can't be
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # relied upon to do correct rounding on all platforms.
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            tail = max(len(bin(abs(tmant)))-2 - mant_dig, etiny - texp)
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if tail > 0:
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                h = 1 << (tail-1)
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                tmant = tmant // (2*h) + bool(tmant & h and tmant & 3*h-1)
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                texp += tail
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return math.ldexp(tmant, texp)
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_values = [
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([], 0.0),
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([0.0], 0.0),
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([1e100, 1.0, -1e100, 1e-100, 1e50, -1.0, -1e50], 1e-100),
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([2.0**53, -0.5, -2.0**-54], 2.0**53-1.0),
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([2.0**53, 1.0, 2.0**-100], 2.0**53+2.0),
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([2.0**53+10.0, 1.0, 2.0**-100], 2.0**53+12.0),
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([2.0**53-4.0, 0.5, 2.0**-54], 2.0**53-3.0),
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([1./n for n in range(1, 1001)],
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             float.fromhex('0x1.df11f45f4e61ap+2')),
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([(-1.)**n/n for n in range(1, 1001)],
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             float.fromhex('-0x1.62a2af1bd3624p-1')),
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([1.7**(i+1)-1.7**i for i in range(1000)] + [-1.7**1000], -1.0),
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([1e16, 1., 1e-16], 10000000000000002.0),
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([1e16-2., 1.-2.**-53, -(1e16-2.), -(1.-2.**-53)], 0.0),
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # exercise code for resizing partials array
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ([2.**n - 2.**(n+50) + 2.**(n+52) for n in range(-1074, 972, 2)] +
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             [-2.**1022],
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             float.fromhex('0x1.5555555555555p+970')),
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ]
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i, (vals, expected) in enumerate(test_values):
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                actual = math.fsum(vals)
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except OverflowError:
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("test %d failed: got OverflowError, expected %r "
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          "for math.fsum(%.100r)" % (i, expected, vals))
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError:
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("test %d failed: got ValueError, expected %r "
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          "for math.fsum(%.100r)" % (i, expected, vals))
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(actual, expected)
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from random import random, gauss, shuffle
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for j in xrange(1000):
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            vals = [7, 1e100, -7, -1e100, -9e-20, 8e-20] * 10
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s = 0
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for i in xrange(200):
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                v = gauss(0, random()) ** 7 - s
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                s += v
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                vals.append(v)
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            shuffle(vals)
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s = msum(vals)
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(msum(vals), math.fsum(vals))
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testHypot(self):
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.hypot)
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('hypot(0,0)', math.hypot(0,0), 0)
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('hypot(3,4)', math.hypot(3,4), 5)
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.hypot(NAN, INF), INF)
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.hypot(INF, NAN), INF)
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.hypot(NAN, NINF), INF)
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.hypot(NINF, NAN), INF)
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.hypot(1.0, NAN)))
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.hypot(NAN, -2.0)))
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testLdexp(self):
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.ldexp)
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('ldexp(0,1)', math.ldexp(0,1), 0)
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('ldexp(1,1)', math.ldexp(1,1), 2)
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('ldexp(1,-1)', math.ldexp(1,-1), 0.5)
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('ldexp(-1,1)', math.ldexp(-1,1), -2)
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(OverflowError, math.ldexp, 1., 1000000)
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(OverflowError, math.ldexp, -1., 1000000)
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.ldexp(1., -1000000), 0.)
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.ldexp(-1., -1000000), -0.)
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.ldexp(INF, 30), INF)
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.ldexp(NINF, -213), NINF)
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.ldexp(NAN, 0)))
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # large second argument
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for n in [10**5, 10L**5, 10**10, 10L**10, 10**20, 10**40]:
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.ldexp(INF, -n), INF)
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.ldexp(NINF, -n), NINF)
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.ldexp(1., -n), 0.)
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.ldexp(-1., -n), -0.)
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.ldexp(0., -n), 0.)
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.ldexp(-0., -n), -0.)
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(math.isnan(math.ldexp(NAN, -n)))
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(OverflowError, math.ldexp, 1., n)
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(OverflowError, math.ldexp, -1., n)
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.ldexp(0., n), 0.)
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.ldexp(-0., n), -0.)
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.ldexp(INF, n), INF)
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.ldexp(NINF, n), NINF)
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(math.isnan(math.ldexp(NAN, n)))
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testLog(self):
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.log)
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log(1/e)', math.log(1/math.e), -1)
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log(1)', math.log(1), 0)
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log(e)', math.log(math.e), 1)
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log(32,2)', math.log(32,2), 5)
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log(10**40, 10)', math.log(10**40, 10), 40)
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log(10**40, 10**20)', math.log(10**40, 10**20), 2)
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.log(INF), INF)
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.log, NINF)
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.log(NAN)))
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testLog1p(self):
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.log1p)
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log1p(1/e -1)', math.log1p(1/math.e-1), -1)
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log1p(0)', math.log1p(0), 0)
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log1p(e-1)', math.log1p(math.e-1), 1)
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log1p(1)', math.log1p(1), math.log(2))
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.log1p(INF), INF)
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.log1p, NINF)
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.log1p(NAN)))
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n= 2**90
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(math.log1p(n), 62.383246250395075)
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAlmostEqual(math.log1p(n), math.log1p(float(n)))
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testLog10(self):
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.log10)
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log10(0.1)', math.log10(0.1), -1)
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log10(1)', math.log10(1), 0)
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('log10(10)', math.log10(10), 1)
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.log(INF), INF)
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.log10, NINF)
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.log10(NAN)))
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testModf(self):
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.modf)
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def testmodf(name, result, expected):
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (v1, v2), (e1, e2) = result, expected
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if abs(v1-e1) > eps or abs(v2-e2):
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail('%s returned %r, expected %r'%\
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          (name, (v1,v2), (e1,e2)))
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testmodf('modf(1.5)', math.modf(1.5), (0.5, 1.0))
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testmodf('modf(-1.5)', math.modf(-1.5), (-0.5, -1.0))
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.modf(INF), (0.0, INF))
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.modf(NINF), (-0.0, NINF))
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        modf_nan = math.modf(NAN)
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(modf_nan[0]))
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(modf_nan[1]))
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testPow(self):
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.pow)
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('pow(0,1)', math.pow(0,1), 0)
6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('pow(1,0)', math.pow(1,0), 1)
6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('pow(2,1)', math.pow(2,1), 2)
6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('pow(2,-1)', math.pow(2,-1), 0.5)
6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(INF, 1), INF)
6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NINF, 1), NINF)
6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual((math.pow(1, INF)), 1.)
6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual((math.pow(1, NINF)), 1.)
6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.pow(NAN, 1)))
6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.pow(2, NAN)))
6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.pow(0, NAN)))
6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1, NAN), 1)
6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow(0., x)
6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(0., INF), 0.)
6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(0., 3.), 0.)
6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(0., 2.3), 0.)
6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(0., 2.), 0.)
6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(0., 0.), 1.)
6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(0., -0.), 1.)
6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, 0., -2.)
6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, 0., -2.3)
6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, 0., -3.)
6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, 0., NINF)
6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.pow(0., NAN)))
6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow(INF, x)
6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(INF, INF), INF)
6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(INF, 3.), INF)
6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(INF, 2.3), INF)
6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(INF, 2.), INF)
6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(INF, 0.), 1.)
6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(INF, -0.), 1.)
6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(INF, -2.), 0.)
6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(INF, -2.3), 0.)
6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(INF, -3.), 0.)
6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(INF, NINF), 0.)
6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.pow(INF, NAN)))
6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow(-0., x)
6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-0., INF), 0.)
6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-0., 3.), -0.)
6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-0., 2.3), 0.)
6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-0., 2.), 0.)
6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-0., 0.), 1.)
6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-0., -0.), 1.)
6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, -0., -2.)
6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, -0., -2.3)
6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, -0., -3.)
6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, -0., NINF)
6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.pow(-0., NAN)))
6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow(NINF, x)
6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NINF, INF), INF)
7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NINF, 3.), NINF)
7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NINF, 2.3), INF)
7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NINF, 2.), INF)
7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NINF, 0.), 1.)
7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NINF, -0.), 1.)
7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NINF, -2.), 0.)
7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NINF, -2.3), 0.)
7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NINF, -3.), -0.)
7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NINF, NINF), 0.)
7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.pow(NINF, NAN)))
7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow(-1, x)
7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1., INF), 1.)
7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1., 3.), -1.)
7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, -1., 2.3)
7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1., 2.), 1.)
7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1., 0.), 1.)
7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1., -0.), 1.)
7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1., -2.), 1.)
7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, -1., -2.3)
7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1., -3.), -1.)
7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1., NINF), 1.)
7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.pow(-1., NAN)))
7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow(1, x)
7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1., INF), 1.)
7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1., 3.), 1.)
7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1., 2.3), 1.)
7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1., 2.), 1.)
7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1., 0.), 1.)
7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1., -0.), 1.)
7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1., -2.), 1.)
7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1., -2.3), 1.)
7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1., -3.), 1.)
7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1., NINF), 1.)
7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1., NAN), 1.)
7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow(x, 0) should be 1 for any x
7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(2.3, 0.), 1.)
7394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-2.3, 0.), 1.)
7404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NAN, 0.), 1.)
7414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(2.3, -0.), 1.)
7424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-2.3, -0.), 1.)
7434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(NAN, -0.), 1.)
7444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow(x, y) is invalid if x is negative and y is not integral
7464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, -1., 2.3)
7474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, -15., -3.1)
7484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow(x, NINF)
7504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1.9, NINF), 0.)
7514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1.1, NINF), 0.)
7524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(0.9, NINF), INF)
7534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(0.1, NINF), INF)
7544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-0.1, NINF), INF)
7554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-0.9, NINF), INF)
7564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1.1, NINF), 0.)
7574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1.9, NINF), 0.)
7584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow(x, INF)
7604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1.9, INF), INF)
7614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(1.1, INF), INF)
7624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(0.9, INF), 0.)
7634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(0.1, INF), 0.)
7644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-0.1, INF), 0.)
7654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-0.9, INF), 0.)
7664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1.1, INF), INF)
7674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.pow(-1.9, INF), INF)
7684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pow(x, y) should work for x negative, y an integer
7704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('(-2.)**3.', math.pow(-2.0, 3.0), -8.0)
7714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('(-2.)**2.', math.pow(-2.0, 2.0), 4.0)
7724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('(-2.)**1.', math.pow(-2.0, 1.0), -2.0)
7734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('(-2.)**0.', math.pow(-2.0, 0.0), 1.0)
7744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('(-2.)**-0.', math.pow(-2.0, -0.0), 1.0)
7754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('(-2.)**-1.', math.pow(-2.0, -1.0), -0.5)
7764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('(-2.)**-2.', math.pow(-2.0, -2.0), 0.25)
7774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('(-2.)**-3.', math.pow(-2.0, -3.0), -0.125)
7784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, -2.0, -0.5)
7794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.pow, -2.0, 0.5)
7804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # the following tests have been commented out since they don't
7824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # really belong here:  the implementation of ** for floats is
7834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # independent of the implementation of math.pow
7844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #self.assertEqual(1**NAN, 1)
7854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #self.assertEqual(1**INF, 1)
7864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #self.assertEqual(1**NINF, 1)
7874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #self.assertEqual(1**0, 1)
7884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #self.assertEqual(1.**NAN, 1)
7894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #self.assertEqual(1.**INF, 1)
7904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #self.assertEqual(1.**NINF, 1)
7914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #self.assertEqual(1.**0, 1)
7924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testRadians(self):
7944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.radians)
7954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('radians(180)', math.radians(180), math.pi)
7964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('radians(90)', math.radians(90), math.pi/2)
7974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('radians(-45)', math.radians(-45), -math.pi/4)
7984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testSin(self):
8004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.sin)
8014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('sin(0)', math.sin(0), 0)
8024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('sin(pi/2)', math.sin(math.pi/2), 1)
8034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('sin(-pi/2)', math.sin(-math.pi/2), -1)
8044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
8054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(math.isnan(math.sin(INF)))
8064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(math.isnan(math.sin(NINF)))
8074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
8084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(ValueError, math.sin, INF)
8094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(ValueError, math.sin, NINF)
8104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.sin(NAN)))
8114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testSinh(self):
8134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.sinh)
8144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('sinh(0)', math.sinh(0), 0)
8154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('sinh(1)**2-cosh(1)**2', math.sinh(1)**2-math.cosh(1)**2, -1)
8164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('sinh(1)+sinh(-1)', math.sinh(1)+math.sinh(-1), 0)
8174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.sinh(INF), INF)
8184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.sinh(NINF), NINF)
8194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.sinh(NAN)))
8204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testSqrt(self):
8224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.sqrt)
8234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('sqrt(0)', math.sqrt(0), 0)
8244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('sqrt(1)', math.sqrt(1), 1)
8254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('sqrt(4)', math.sqrt(4), 2)
8264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.sqrt(INF), INF)
8274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, math.sqrt, NINF)
8284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.sqrt(NAN)))
8294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testTan(self):
8314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.tan)
8324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('tan(0)', math.tan(0), 0)
8334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('tan(pi/4)', math.tan(math.pi/4), 1)
8344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('tan(-pi/4)', math.tan(-math.pi/4), -1)
8354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
8364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(math.isnan(math.tan(INF)))
8374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(math.isnan(math.tan(NINF)))
8384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
8394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(ValueError, math.tan, INF)
8404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(ValueError, math.tan, NINF)
8414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.tan(NAN)))
8424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testTanh(self):
8444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.tanh)
8454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('tanh(0)', math.tanh(0), 0)
8464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('tanh(1)+tanh(-1)', math.tanh(1)+math.tanh(-1), 0)
8474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('tanh(inf)', math.tanh(INF), 1)
8484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.ftest('tanh(-inf)', math.tanh(NINF), -1)
8494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(math.tanh(NAN)))
8504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check that tanh(-0.) == -0. on IEEE 754 systems
8514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if float.__getformat__("double").startswith("IEEE"):
8524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.tanh(-0.), -0.)
8534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(math.copysign(1., math.tanh(-0.)),
8544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             math.copysign(1., -0.))
8554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_trunc(self):
8574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.trunc(1), 1)
8584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.trunc(-1), -1)
8594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(type(math.trunc(1)), int)
8604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(type(math.trunc(1.5)), int)
8614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.trunc(1.5), 1)
8624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.trunc(-1.5), -1)
8634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.trunc(1.999999), 1)
8644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.trunc(-1.999999), -1)
8654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.trunc(-0.999999), -0)
8664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.trunc(-100.999), -100)
8674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class TestTrunc(object):
8694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __trunc__(self):
8704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 23
8714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class TestNoTrunc(object):
8734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
8744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(math.trunc(TestTrunc()), 23)
8764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.trunc)
8784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, math.trunc, 1, 2)
8794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises((AttributeError, TypeError), math.trunc,
8804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          TestNoTrunc())
8814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testIsnan(self):
8834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(float("nan")))
8844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isnan(float("inf")* 0.))
8854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(math.isnan(float("inf")))
8864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(math.isnan(0.))
8874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(math.isnan(1.))
8884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testIsinf(self):
8904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isinf(float("inf")))
8914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isinf(float("-inf")))
8924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isinf(1E400))
8934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(math.isinf(-1E400))
8944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(math.isinf(float("nan")))
8954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(math.isinf(0.))
8964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(math.isinf(1.))
8974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # RED_FLAG 16-Oct-2000 Tim
8994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # While 2.0 is more consistent about exceptions than previous releases, it
9004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # still fails this part of the test on some platforms.  For now, we only
9014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # *run* test_exceptions() in verbose mode, so that this isn't normally
9024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # tested.
9034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if verbose:
9054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def test_exceptions(self):
9064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
9074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                x = math.exp(-1000000000)
9084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except:
9094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # mathmodule.c is failing to weed out underflows from libm, or
9104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # we've got an fp format with huge dynamic range
9114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("underflowing exp() should not have raised "
9124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          "an exception")
9134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if x != 0:
9144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("underflowing exp() should have returned 0")
9154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # If this fails, probably using a strict IEEE-754 conforming libm, and x
9174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # is +Inf afterwards.  But Python wants overflows detected by default.
9184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
9194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                x = math.exp(1000000000)
9204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except OverflowError:
9214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
9224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
9234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("overflowing exp() didn't trigger OverflowError")
9244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # If this fails, it could be a puzzle.  One odd possibility is that
9264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # mathmodule.c's macros are getting confused while comparing
9274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Inf (HUGE_VAL) to a NaN, and artificially setting errno to ERANGE
9284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # as a result (and so raising OverflowError instead).
9294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
9304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                x = math.sqrt(-1.0)
9314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError:
9324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
9334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
9344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("sqrt(-1) didn't raise ValueError")
9354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @requires_IEEE_754
9374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_testfile(self):
9384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for id, fn, ar, ai, er, ei, flags in parse_testfile(test_file):
9394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Skip if either the input or result is complex, or if
9404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # flags is nonempty
9414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if ai != 0. or ei != 0. or flags:
9424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
9434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if fn in ['rect', 'polar']:
9444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # no real versions of rect, polar
9454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
9464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            func = getattr(math, fn)
9474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
9484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                result = func(ar)
9494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError:
9504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                message = ("Unexpected ValueError in " +
9514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           "test %s:%s(%r)\n" % (id, fn, ar))
9524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail(message)
9534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except OverflowError:
9544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                message = ("Unexpected OverflowError in " +
9554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           "test %s:%s(%r)\n" % (id, fn, ar))
9564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail(message)
9574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.ftest("%s:%s(%r)" % (id, fn, ar), result, er)
9584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
9604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "test requires IEEE 754 doubles")
9614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_mtestfile(self):
9624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ALLOWED_ERROR = 20  # permitted error, in ulps
9634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        fail_fmt = "{}:{}({!r}): expected {!r}, got {!r}"
9644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        failures = []
9664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for id, fn, arg, expected, flags in parse_mtestfile(math_testcases):
9674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            func = getattr(math, fn)
9684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if 'invalid' in flags or 'divide-by-zero' in flags:
9704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                expected = 'ValueError'
9714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif 'overflow' in flags:
9724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                expected = 'OverflowError'
9734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
9754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                got = func(arg)
9764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError:
9774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                got = 'ValueError'
9784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except OverflowError:
9794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                got = 'OverflowError'
9804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            accuracy_failure = None
9824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(got, float) and isinstance(expected, float):
9834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if math.isnan(expected) and math.isnan(got):
9844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    continue
9854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if not math.isnan(expected) and not math.isnan(got):
9864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if fn == 'lgamma':
9874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # we use a weaker accuracy test for lgamma;
9884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # lgamma only achieves an absolute error of
9894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # a few multiples of the machine accuracy, in
9904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # general.
9914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        accuracy_failure = acc_check(expected, got,
9924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                  rel_err = 5e-15,
9934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                  abs_err = 5e-15)
9944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    elif fn == 'erfc':
9954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # erfc has less-than-ideal accuracy for large
9964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # arguments (x ~ 25 or so), mainly due to the
9974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # error involved in computing exp(-x*x).
9984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        #
9994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # XXX Would be better to weaken this test only
10004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # for large x, instead of for all x.
10014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        accuracy_failure = ulps_check(expected, got, 2000)
10024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    else:
10044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        accuracy_failure = ulps_check(expected, got, 20)
10054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if accuracy_failure is None:
10064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        continue
10074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(got, str) and isinstance(expected, str):
10094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if got == expected:
10104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    continue
10114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            fail_msg = fail_fmt.format(id, fn, arg, expected, got)
10134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if accuracy_failure is not None:
10144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                fail_msg += ' ({})'.format(accuracy_failure)
10154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            failures.append(fail_msg)
10164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if failures:
10184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail('Failures in test_mtestfile:\n  ' +
10194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      '\n  '.join(failures))
10204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
10234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from doctest import DocFileSuite
10244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    suite = unittest.TestSuite()
10254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    suite.addTest(unittest.makeSuite(MathTests))
10264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    suite.addTest(DocFileSuite("ieee754.txt"))
10274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    run_unittest(suite)
10284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == '__main__':
10304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
1031