blob: fa690441be43cec52ec70e6bff241656bd6109ea [file] [log] [blame]
Guido van Rossumfcce6301996-08-08 18:26:25 +00001# Python test set -- math module
2# XXXX Should not do tests around zero only
3
Eric Smithf24a0d92010-12-04 13:32:18 +00004from test.support import run_unittest, verbose, requires_IEEE_754
Victor Stinnerfce92332011-06-01 12:28:04 +02005from test import support
Thomas Wouters89f507f2006-12-13 04:49:30 +00006import unittest
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07007import itertools
Pablo Galindoe9ba3702018-09-03 22:20:06 +01008import decimal
Thomas Wouters89f507f2006-12-13 04:49:30 +00009import math
Christian Heimes53876d92008-04-19 00:31:39 +000010import os
Mark Dickinson85746542016-09-04 09:58:51 +010011import platform
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -070012import random
Mark Dickinson12c4bdb2009-09-28 19:21:11 +000013import struct
Mark Dickinson85746542016-09-04 09:58:51 +010014import sys
Victor Stinnerbe3da382010-11-07 14:14:27 +000015import sysconfig
Guido van Rossumfcce6301996-08-08 18:26:25 +000016
Christian Heimes53876d92008-04-19 00:31:39 +000017eps = 1E-05
18NAN = float('nan')
19INF = float('inf')
20NINF = float('-inf')
Mark Dickinson31ba1c32016-09-04 12:29:14 +010021FLOAT_MAX = sys.float_info.max
Raymond Hettingerc6dabe32018-07-28 07:48:04 -070022FLOAT_MIN = sys.float_info.min
Christian Heimes53876d92008-04-19 00:31:39 +000023
Mark Dickinson5c567082009-04-24 16:39:07 +000024# detect evidence of double-rounding: fsum is not always correctly
25# rounded on machines that suffer from double rounding.
26x, y = 1e16, 2.9999 # use temporary values to defeat peephole optimizer
27HAVE_DOUBLE_ROUNDING = (x + y == 1e16 + 4)
28
Christian Heimes53876d92008-04-19 00:31:39 +000029# locate file with test values
30if __name__ == '__main__':
31 file = sys.argv[0]
32else:
33 file = __file__
34test_dir = os.path.dirname(file) or os.curdir
Mark Dickinson12c4bdb2009-09-28 19:21:11 +000035math_testcases = os.path.join(test_dir, 'math_testcases.txt')
Christian Heimes53876d92008-04-19 00:31:39 +000036test_file = os.path.join(test_dir, 'cmath_testcases.txt')
37
Mark Dickinson96f774d2016-09-03 19:30:22 +010038
Mark Dickinson12c4bdb2009-09-28 19:21:11 +000039def to_ulps(x):
40 """Convert a non-NaN float x to an integer, in such a way that
41 adjacent floats are converted to adjacent integers. Then
42 abs(ulps(x) - ulps(y)) gives the difference in ulps between two
43 floats.
44
45 The results from this function will only make sense on platforms
Mark Dickinson96f774d2016-09-03 19:30:22 +010046 where native doubles are represented in IEEE 754 binary64 format.
Mark Dickinson12c4bdb2009-09-28 19:21:11 +000047
Mark Dickinson96f774d2016-09-03 19:30:22 +010048 Note: 0.0 and -0.0 are converted to 0 and -1, respectively.
Mark Dickinson12c4bdb2009-09-28 19:21:11 +000049 """
Mark Dickinsond412ab52009-10-17 07:10:00 +000050 n = struct.unpack('<q', struct.pack('<d', x))[0]
Mark Dickinson12c4bdb2009-09-28 19:21:11 +000051 if n < 0:
52 n = ~(n+2**63)
53 return n
54
Mark Dickinson05d2e082009-12-11 20:17:17 +000055
Mark Dickinson96f774d2016-09-03 19:30:22 +010056def ulp(x):
57 """Return the value of the least significant bit of a
58 float x, such that the first float bigger than x is x+ulp(x).
59 Then, given an expected result x and a tolerance of n ulps,
60 the result y should be such that abs(y-x) <= n * ulp(x).
61 The results from this function will only make sense on platforms
62 where native doubles are represented in IEEE 754 binary64 format.
63 """
64 x = abs(float(x))
65 if math.isnan(x) or math.isinf(x):
66 return x
Mark Dickinson05d2e082009-12-11 20:17:17 +000067
Mark Dickinson96f774d2016-09-03 19:30:22 +010068 # Find next float up from x.
69 n = struct.unpack('<q', struct.pack('<d', x))[0]
70 x_next = struct.unpack('<d', struct.pack('<q', n + 1))[0]
71 if math.isinf(x_next):
72 # Corner case: x was the largest finite float. Then it's
73 # not an exact power of two, so we can take the difference
74 # between x and the previous float.
75 x_prev = struct.unpack('<d', struct.pack('<q', n - 1))[0]
76 return x - x_prev
77 else:
78 return x_next - x
Mark Dickinson05d2e082009-12-11 20:17:17 +000079
Mark Dickinson4c8a9a22010-05-15 17:02:38 +000080# Here's a pure Python version of the math.factorial algorithm, for
81# documentation and comparison purposes.
82#
83# Formula:
84#
85# factorial(n) = factorial_odd_part(n) << (n - count_set_bits(n))
86#
87# where
88#
89# factorial_odd_part(n) = product_{i >= 0} product_{0 < j <= n >> i; j odd} j
90#
91# The outer product above is an infinite product, but once i >= n.bit_length,
92# (n >> i) < 1 and the corresponding term of the product is empty. So only the
93# finitely many terms for 0 <= i < n.bit_length() contribute anything.
94#
95# We iterate downwards from i == n.bit_length() - 1 to i == 0. The inner
96# product in the formula above starts at 1 for i == n.bit_length(); for each i
97# < n.bit_length() we get the inner product for i from that for i + 1 by
98# multiplying by all j in {n >> i+1 < j <= n >> i; j odd}. In Python terms,
99# this set is range((n >> i+1) + 1 | 1, (n >> i) + 1 | 1, 2).
100
101def count_set_bits(n):
102 """Number of '1' bits in binary expansion of a nonnnegative integer."""
103 return 1 + count_set_bits(n & n - 1) if n else 0
104
105def partial_product(start, stop):
106 """Product of integers in range(start, stop, 2), computed recursively.
107 start and stop should both be odd, with start <= stop.
108
109 """
110 numfactors = (stop - start) >> 1
111 if not numfactors:
112 return 1
113 elif numfactors == 1:
114 return start
115 else:
116 mid = (start + numfactors) | 1
117 return partial_product(start, mid) * partial_product(mid, stop)
118
119def py_factorial(n):
120 """Factorial of nonnegative integer n, via "Binary Split Factorial Formula"
121 described at http://www.luschny.de/math/factorial/binarysplitfact.html
122
123 """
124 inner = outer = 1
125 for i in reversed(range(n.bit_length())):
126 inner *= partial_product((n >> i + 1) + 1 | 1, (n >> i) + 1 | 1)
127 outer *= inner
128 return outer << (n - count_set_bits(n))
129
Mark Dickinson96f774d2016-09-03 19:30:22 +0100130def ulp_abs_check(expected, got, ulp_tol, abs_tol):
131 """Given finite floats `expected` and `got`, check that they're
132 approximately equal to within the given number of ulps or the
133 given absolute tolerance, whichever is bigger.
Mark Dickinson05d2e082009-12-11 20:17:17 +0000134
Mark Dickinson96f774d2016-09-03 19:30:22 +0100135 Returns None on success and an error message on failure.
136 """
137 ulp_error = abs(to_ulps(expected) - to_ulps(got))
138 abs_error = abs(expected - got)
139
140 # Succeed if either abs_error <= abs_tol or ulp_error <= ulp_tol.
141 if abs_error <= abs_tol or ulp_error <= ulp_tol:
Mark Dickinson05d2e082009-12-11 20:17:17 +0000142 return None
Mark Dickinson96f774d2016-09-03 19:30:22 +0100143 else:
144 fmt = ("error = {:.3g} ({:d} ulps); "
145 "permitted error = {:.3g} or {:d} ulps")
146 return fmt.format(abs_error, ulp_error, abs_tol, ulp_tol)
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000147
148def parse_mtestfile(fname):
149 """Parse a file with test values
150
151 -- starts a comment
152 blank lines, or lines containing only a comment, are ignored
153 other lines are expected to have the form
154 id fn arg -> expected [flag]*
155
156 """
157 with open(fname) as fp:
158 for line in fp:
159 # strip comments, and skip blank lines
160 if '--' in line:
161 line = line[:line.index('--')]
162 if not line.strip():
163 continue
164
165 lhs, rhs = line.split('->')
166 id, fn, arg = lhs.split()
167 rhs_pieces = rhs.split()
168 exp = rhs_pieces[0]
169 flags = rhs_pieces[1:]
170
171 yield (id, fn, float(arg), float(exp), flags)
172
Mark Dickinson96f774d2016-09-03 19:30:22 +0100173
Christian Heimes53876d92008-04-19 00:31:39 +0000174def parse_testfile(fname):
175 """Parse a file with test values
176
177 Empty lines or lines starting with -- are ignored
178 yields id, fn, arg_real, arg_imag, exp_real, exp_imag
179 """
180 with open(fname) as fp:
181 for line in fp:
182 # skip comment lines and blank lines
183 if line.startswith('--') or not line.strip():
184 continue
185
186 lhs, rhs = line.split('->')
187 id, fn, arg_real, arg_imag = lhs.split()
188 rhs_pieces = rhs.split()
189 exp_real, exp_imag = rhs_pieces[0], rhs_pieces[1]
190 flags = rhs_pieces[2:]
191
192 yield (id, fn,
193 float(arg_real), float(arg_imag),
194 float(exp_real), float(exp_imag),
Mark Dickinson96f774d2016-09-03 19:30:22 +0100195 flags)
196
197
198def result_check(expected, got, ulp_tol=5, abs_tol=0.0):
199 # Common logic of MathTests.(ftest, test_testcases, test_mtestcases)
200 """Compare arguments expected and got, as floats, if either
201 is a float, using a tolerance expressed in multiples of
202 ulp(expected) or absolutely (if given and greater).
203
204 As a convenience, when neither argument is a float, and for
205 non-finite floats, exact equality is demanded. Also, nan==nan
206 as far as this function is concerned.
207
208 Returns None on success and an error message on failure.
209 """
210
211 # Check exactly equal (applies also to strings representing exceptions)
212 if got == expected:
213 return None
214
215 failure = "not equal"
216
217 # Turn mixed float and int comparison (e.g. floor()) to all-float
218 if isinstance(expected, float) and isinstance(got, int):
219 got = float(got)
220 elif isinstance(got, float) and isinstance(expected, int):
221 expected = float(expected)
222
223 if isinstance(expected, float) and isinstance(got, float):
224 if math.isnan(expected) and math.isnan(got):
225 # Pass, since both nan
226 failure = None
227 elif math.isinf(expected) or math.isinf(got):
228 # We already know they're not equal, drop through to failure
229 pass
230 else:
231 # Both are finite floats (now). Are they close enough?
232 failure = ulp_abs_check(expected, got, ulp_tol, abs_tol)
233
234 # arguments are not equal, and if numeric, are too far apart
235 if failure is not None:
236 fail_fmt = "expected {!r}, got {!r}"
237 fail_msg = fail_fmt.format(expected, got)
238 fail_msg += ' ({})'.format(failure)
239 return fail_msg
240 else:
241 return None
Guido van Rossumfcce6301996-08-08 18:26:25 +0000242
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +0300243class IntSubclass(int):
244 pass
245
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +0300246# Class providing an __index__ method.
247class MyIndexable(object):
248 def __init__(self, value):
249 self.value = value
250
251 def __index__(self):
252 return self.value
253
Thomas Wouters89f507f2006-12-13 04:49:30 +0000254class MathTests(unittest.TestCase):
Guido van Rossumfcce6301996-08-08 18:26:25 +0000255
Mark Dickinson96f774d2016-09-03 19:30:22 +0100256 def ftest(self, name, got, expected, ulp_tol=5, abs_tol=0.0):
257 """Compare arguments expected and got, as floats, if either
258 is a float, using a tolerance expressed in multiples of
259 ulp(expected) or absolutely, whichever is greater.
260
261 As a convenience, when neither argument is a float, and for
262 non-finite floats, exact equality is demanded. Also, nan==nan
263 in this function.
264 """
265 failure = result_check(expected, got, ulp_tol, abs_tol)
266 if failure is not None:
267 self.fail("{}: {}".format(name, failure))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000268
Thomas Wouters89f507f2006-12-13 04:49:30 +0000269 def testConstants(self):
Mark Dickinson96f774d2016-09-03 19:30:22 +0100270 # Ref: Abramowitz & Stegun (Dover, 1965)
271 self.ftest('pi', math.pi, 3.141592653589793238462643)
272 self.ftest('e', math.e, 2.718281828459045235360287)
Guido van Rossum0a891d72016-08-15 09:12:52 -0700273 self.assertEqual(math.tau, 2*math.pi)
Guido van Rossumfcce6301996-08-08 18:26:25 +0000274
Thomas Wouters89f507f2006-12-13 04:49:30 +0000275 def testAcos(self):
276 self.assertRaises(TypeError, math.acos)
277 self.ftest('acos(-1)', math.acos(-1), math.pi)
278 self.ftest('acos(0)', math.acos(0), math.pi/2)
279 self.ftest('acos(1)', math.acos(1), 0)
Christian Heimes53876d92008-04-19 00:31:39 +0000280 self.assertRaises(ValueError, math.acos, INF)
281 self.assertRaises(ValueError, math.acos, NINF)
Mark Dickinson31ba1c32016-09-04 12:29:14 +0100282 self.assertRaises(ValueError, math.acos, 1 + eps)
283 self.assertRaises(ValueError, math.acos, -1 - eps)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000284 self.assertTrue(math.isnan(math.acos(NAN)))
Christian Heimes53876d92008-04-19 00:31:39 +0000285
286 def testAcosh(self):
287 self.assertRaises(TypeError, math.acosh)
288 self.ftest('acosh(1)', math.acosh(1), 0)
289 self.ftest('acosh(2)', math.acosh(2), 1.3169578969248168)
290 self.assertRaises(ValueError, math.acosh, 0)
291 self.assertRaises(ValueError, math.acosh, -1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000292 self.assertEqual(math.acosh(INF), INF)
Christian Heimes53876d92008-04-19 00:31:39 +0000293 self.assertRaises(ValueError, math.acosh, NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000294 self.assertTrue(math.isnan(math.acosh(NAN)))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000295
Thomas Wouters89f507f2006-12-13 04:49:30 +0000296 def testAsin(self):
297 self.assertRaises(TypeError, math.asin)
298 self.ftest('asin(-1)', math.asin(-1), -math.pi/2)
299 self.ftest('asin(0)', math.asin(0), 0)
300 self.ftest('asin(1)', math.asin(1), math.pi/2)
Christian Heimes53876d92008-04-19 00:31:39 +0000301 self.assertRaises(ValueError, math.asin, INF)
302 self.assertRaises(ValueError, math.asin, NINF)
Mark Dickinson31ba1c32016-09-04 12:29:14 +0100303 self.assertRaises(ValueError, math.asin, 1 + eps)
304 self.assertRaises(ValueError, math.asin, -1 - eps)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000305 self.assertTrue(math.isnan(math.asin(NAN)))
Christian Heimes53876d92008-04-19 00:31:39 +0000306
307 def testAsinh(self):
308 self.assertRaises(TypeError, math.asinh)
309 self.ftest('asinh(0)', math.asinh(0), 0)
310 self.ftest('asinh(1)', math.asinh(1), 0.88137358701954305)
311 self.ftest('asinh(-1)', math.asinh(-1), -0.88137358701954305)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000312 self.assertEqual(math.asinh(INF), INF)
313 self.assertEqual(math.asinh(NINF), NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000314 self.assertTrue(math.isnan(math.asinh(NAN)))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000315
Thomas Wouters89f507f2006-12-13 04:49:30 +0000316 def testAtan(self):
317 self.assertRaises(TypeError, math.atan)
318 self.ftest('atan(-1)', math.atan(-1), -math.pi/4)
319 self.ftest('atan(0)', math.atan(0), 0)
320 self.ftest('atan(1)', math.atan(1), math.pi/4)
Christian Heimes53876d92008-04-19 00:31:39 +0000321 self.ftest('atan(inf)', math.atan(INF), math.pi/2)
Christian Heimesa342c012008-04-20 21:01:16 +0000322 self.ftest('atan(-inf)', math.atan(NINF), -math.pi/2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000323 self.assertTrue(math.isnan(math.atan(NAN)))
Christian Heimes53876d92008-04-19 00:31:39 +0000324
325 def testAtanh(self):
326 self.assertRaises(TypeError, math.atan)
327 self.ftest('atanh(0)', math.atanh(0), 0)
328 self.ftest('atanh(0.5)', math.atanh(0.5), 0.54930614433405489)
329 self.ftest('atanh(-0.5)', math.atanh(-0.5), -0.54930614433405489)
330 self.assertRaises(ValueError, math.atanh, 1)
331 self.assertRaises(ValueError, math.atanh, -1)
332 self.assertRaises(ValueError, math.atanh, INF)
333 self.assertRaises(ValueError, math.atanh, NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000334 self.assertTrue(math.isnan(math.atanh(NAN)))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000335
Thomas Wouters89f507f2006-12-13 04:49:30 +0000336 def testAtan2(self):
337 self.assertRaises(TypeError, math.atan2)
338 self.ftest('atan2(-1, 0)', math.atan2(-1, 0), -math.pi/2)
339 self.ftest('atan2(-1, 1)', math.atan2(-1, 1), -math.pi/4)
340 self.ftest('atan2(0, 1)', math.atan2(0, 1), 0)
341 self.ftest('atan2(1, 1)', math.atan2(1, 1), math.pi/4)
342 self.ftest('atan2(1, 0)', math.atan2(1, 0), math.pi/2)
Guido van Rossumfcce6301996-08-08 18:26:25 +0000343
Christian Heimese57950f2008-04-21 13:08:03 +0000344 # math.atan2(0, x)
345 self.ftest('atan2(0., -inf)', math.atan2(0., NINF), math.pi)
346 self.ftest('atan2(0., -2.3)', math.atan2(0., -2.3), math.pi)
347 self.ftest('atan2(0., -0.)', math.atan2(0., -0.), math.pi)
348 self.assertEqual(math.atan2(0., 0.), 0.)
349 self.assertEqual(math.atan2(0., 2.3), 0.)
350 self.assertEqual(math.atan2(0., INF), 0.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000351 self.assertTrue(math.isnan(math.atan2(0., NAN)))
Christian Heimese57950f2008-04-21 13:08:03 +0000352 # math.atan2(-0, x)
353 self.ftest('atan2(-0., -inf)', math.atan2(-0., NINF), -math.pi)
354 self.ftest('atan2(-0., -2.3)', math.atan2(-0., -2.3), -math.pi)
355 self.ftest('atan2(-0., -0.)', math.atan2(-0., -0.), -math.pi)
356 self.assertEqual(math.atan2(-0., 0.), -0.)
357 self.assertEqual(math.atan2(-0., 2.3), -0.)
358 self.assertEqual(math.atan2(-0., INF), -0.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000359 self.assertTrue(math.isnan(math.atan2(-0., NAN)))
Christian Heimese57950f2008-04-21 13:08:03 +0000360 # math.atan2(INF, x)
361 self.ftest('atan2(inf, -inf)', math.atan2(INF, NINF), math.pi*3/4)
362 self.ftest('atan2(inf, -2.3)', math.atan2(INF, -2.3), math.pi/2)
363 self.ftest('atan2(inf, -0.)', math.atan2(INF, -0.0), math.pi/2)
364 self.ftest('atan2(inf, 0.)', math.atan2(INF, 0.0), math.pi/2)
365 self.ftest('atan2(inf, 2.3)', math.atan2(INF, 2.3), math.pi/2)
366 self.ftest('atan2(inf, inf)', math.atan2(INF, INF), math.pi/4)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000367 self.assertTrue(math.isnan(math.atan2(INF, NAN)))
Christian Heimese57950f2008-04-21 13:08:03 +0000368 # math.atan2(NINF, x)
369 self.ftest('atan2(-inf, -inf)', math.atan2(NINF, NINF), -math.pi*3/4)
370 self.ftest('atan2(-inf, -2.3)', math.atan2(NINF, -2.3), -math.pi/2)
371 self.ftest('atan2(-inf, -0.)', math.atan2(NINF, -0.0), -math.pi/2)
372 self.ftest('atan2(-inf, 0.)', math.atan2(NINF, 0.0), -math.pi/2)
373 self.ftest('atan2(-inf, 2.3)', math.atan2(NINF, 2.3), -math.pi/2)
374 self.ftest('atan2(-inf, inf)', math.atan2(NINF, INF), -math.pi/4)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000375 self.assertTrue(math.isnan(math.atan2(NINF, NAN)))
Christian Heimese57950f2008-04-21 13:08:03 +0000376 # math.atan2(+finite, x)
377 self.ftest('atan2(2.3, -inf)', math.atan2(2.3, NINF), math.pi)
378 self.ftest('atan2(2.3, -0.)', math.atan2(2.3, -0.), math.pi/2)
379 self.ftest('atan2(2.3, 0.)', math.atan2(2.3, 0.), math.pi/2)
380 self.assertEqual(math.atan2(2.3, INF), 0.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000381 self.assertTrue(math.isnan(math.atan2(2.3, NAN)))
Christian Heimese57950f2008-04-21 13:08:03 +0000382 # math.atan2(-finite, x)
383 self.ftest('atan2(-2.3, -inf)', math.atan2(-2.3, NINF), -math.pi)
384 self.ftest('atan2(-2.3, -0.)', math.atan2(-2.3, -0.), -math.pi/2)
385 self.ftest('atan2(-2.3, 0.)', math.atan2(-2.3, 0.), -math.pi/2)
386 self.assertEqual(math.atan2(-2.3, INF), -0.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000387 self.assertTrue(math.isnan(math.atan2(-2.3, NAN)))
Christian Heimese57950f2008-04-21 13:08:03 +0000388 # math.atan2(NAN, x)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000389 self.assertTrue(math.isnan(math.atan2(NAN, NINF)))
390 self.assertTrue(math.isnan(math.atan2(NAN, -2.3)))
391 self.assertTrue(math.isnan(math.atan2(NAN, -0.)))
392 self.assertTrue(math.isnan(math.atan2(NAN, 0.)))
393 self.assertTrue(math.isnan(math.atan2(NAN, 2.3)))
394 self.assertTrue(math.isnan(math.atan2(NAN, INF)))
395 self.assertTrue(math.isnan(math.atan2(NAN, NAN)))
Christian Heimese57950f2008-04-21 13:08:03 +0000396
Thomas Wouters89f507f2006-12-13 04:49:30 +0000397 def testCeil(self):
398 self.assertRaises(TypeError, math.ceil)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000399 self.assertEqual(int, type(math.ceil(0.5)))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000400 self.ftest('ceil(0.5)', math.ceil(0.5), 1)
401 self.ftest('ceil(1.0)', math.ceil(1.0), 1)
402 self.ftest('ceil(1.5)', math.ceil(1.5), 2)
403 self.ftest('ceil(-0.5)', math.ceil(-0.5), 0)
404 self.ftest('ceil(-1.0)', math.ceil(-1.0), -1)
405 self.ftest('ceil(-1.5)', math.ceil(-1.5), -1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000406 #self.assertEqual(math.ceil(INF), INF)
407 #self.assertEqual(math.ceil(NINF), NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000408 #self.assertTrue(math.isnan(math.ceil(NAN)))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000409
Guido van Rossum13e05de2007-08-23 22:56:55 +0000410 class TestCeil:
411 def __ceil__(self):
412 return 42
413 class TestNoCeil:
414 pass
415 self.ftest('ceil(TestCeil())', math.ceil(TestCeil()), 42)
416 self.assertRaises(TypeError, math.ceil, TestNoCeil())
417
418 t = TestNoCeil()
419 t.__ceil__ = lambda *args: args
420 self.assertRaises(TypeError, math.ceil, t)
421 self.assertRaises(TypeError, math.ceil, t, 0)
422
Mark Dickinson63566232009-09-18 21:04:19 +0000423 @requires_IEEE_754
424 def testCopysign(self):
Mark Dickinson06b59e02010-02-06 23:16:50 +0000425 self.assertEqual(math.copysign(1, 42), 1.0)
426 self.assertEqual(math.copysign(0., 42), 0.0)
427 self.assertEqual(math.copysign(1., -42), -1.0)
428 self.assertEqual(math.copysign(3, 0.), 3.0)
429 self.assertEqual(math.copysign(4., -0.), -4.0)
430
Mark Dickinson63566232009-09-18 21:04:19 +0000431 self.assertRaises(TypeError, math.copysign)
432 # copysign should let us distinguish signs of zeros
Ezio Melottib3aedd42010-11-20 19:04:17 +0000433 self.assertEqual(math.copysign(1., 0.), 1.)
434 self.assertEqual(math.copysign(1., -0.), -1.)
435 self.assertEqual(math.copysign(INF, 0.), INF)
436 self.assertEqual(math.copysign(INF, -0.), NINF)
437 self.assertEqual(math.copysign(NINF, 0.), INF)
438 self.assertEqual(math.copysign(NINF, -0.), NINF)
Mark Dickinson63566232009-09-18 21:04:19 +0000439 # and of infinities
Ezio Melottib3aedd42010-11-20 19:04:17 +0000440 self.assertEqual(math.copysign(1., INF), 1.)
441 self.assertEqual(math.copysign(1., NINF), -1.)
442 self.assertEqual(math.copysign(INF, INF), INF)
443 self.assertEqual(math.copysign(INF, NINF), NINF)
444 self.assertEqual(math.copysign(NINF, INF), INF)
445 self.assertEqual(math.copysign(NINF, NINF), NINF)
Mark Dickinson06b59e02010-02-06 23:16:50 +0000446 self.assertTrue(math.isnan(math.copysign(NAN, 1.)))
447 self.assertTrue(math.isnan(math.copysign(NAN, INF)))
448 self.assertTrue(math.isnan(math.copysign(NAN, NINF)))
449 self.assertTrue(math.isnan(math.copysign(NAN, NAN)))
Mark Dickinson63566232009-09-18 21:04:19 +0000450 # copysign(INF, NAN) may be INF or it may be NINF, since
451 # we don't know whether the sign bit of NAN is set on any
452 # given platform.
Mark Dickinson06b59e02010-02-06 23:16:50 +0000453 self.assertTrue(math.isinf(math.copysign(INF, NAN)))
Mark Dickinson63566232009-09-18 21:04:19 +0000454 # similarly, copysign(2., NAN) could be 2. or -2.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000455 self.assertEqual(abs(math.copysign(2., NAN)), 2.)
Christian Heimes53876d92008-04-19 00:31:39 +0000456
Thomas Wouters89f507f2006-12-13 04:49:30 +0000457 def testCos(self):
458 self.assertRaises(TypeError, math.cos)
Mark Dickinson96f774d2016-09-03 19:30:22 +0100459 self.ftest('cos(-pi/2)', math.cos(-math.pi/2), 0, abs_tol=ulp(1))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000460 self.ftest('cos(0)', math.cos(0), 1)
Mark Dickinson96f774d2016-09-03 19:30:22 +0100461 self.ftest('cos(pi/2)', math.cos(math.pi/2), 0, abs_tol=ulp(1))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000462 self.ftest('cos(pi)', math.cos(math.pi), -1)
Christian Heimes53876d92008-04-19 00:31:39 +0000463 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000464 self.assertTrue(math.isnan(math.cos(INF)))
465 self.assertTrue(math.isnan(math.cos(NINF)))
Christian Heimes53876d92008-04-19 00:31:39 +0000466 except ValueError:
467 self.assertRaises(ValueError, math.cos, INF)
468 self.assertRaises(ValueError, math.cos, NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000469 self.assertTrue(math.isnan(math.cos(NAN)))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000470
Thomas Wouters89f507f2006-12-13 04:49:30 +0000471 def testCosh(self):
472 self.assertRaises(TypeError, math.cosh)
473 self.ftest('cosh(0)', math.cosh(0), 1)
474 self.ftest('cosh(2)-2*cosh(1)**2', math.cosh(2)-2*math.cosh(1)**2, -1) # Thanks to Lambert
Ezio Melottib3aedd42010-11-20 19:04:17 +0000475 self.assertEqual(math.cosh(INF), INF)
476 self.assertEqual(math.cosh(NINF), INF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000477 self.assertTrue(math.isnan(math.cosh(NAN)))
Raymond Hettinger64108af2002-05-13 03:55:01 +0000478
Thomas Wouters89f507f2006-12-13 04:49:30 +0000479 def testDegrees(self):
480 self.assertRaises(TypeError, math.degrees)
481 self.ftest('degrees(pi)', math.degrees(math.pi), 180.0)
482 self.ftest('degrees(pi/2)', math.degrees(math.pi/2), 90.0)
483 self.ftest('degrees(-pi/4)', math.degrees(-math.pi/4), -45.0)
Mark Dickinson31ba1c32016-09-04 12:29:14 +0100484 self.ftest('degrees(0)', math.degrees(0), 0)
Guido van Rossumfcce6301996-08-08 18:26:25 +0000485
Thomas Wouters89f507f2006-12-13 04:49:30 +0000486 def testExp(self):
487 self.assertRaises(TypeError, math.exp)
488 self.ftest('exp(-1)', math.exp(-1), 1/math.e)
489 self.ftest('exp(0)', math.exp(0), 1)
490 self.ftest('exp(1)', math.exp(1), math.e)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000491 self.assertEqual(math.exp(INF), INF)
492 self.assertEqual(math.exp(NINF), 0.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000493 self.assertTrue(math.isnan(math.exp(NAN)))
Mark Dickinson31ba1c32016-09-04 12:29:14 +0100494 self.assertRaises(OverflowError, math.exp, 1000000)
Guido van Rossumfcce6301996-08-08 18:26:25 +0000495
Thomas Wouters89f507f2006-12-13 04:49:30 +0000496 def testFabs(self):
497 self.assertRaises(TypeError, math.fabs)
498 self.ftest('fabs(-1)', math.fabs(-1), 1)
499 self.ftest('fabs(0)', math.fabs(0), 0)
500 self.ftest('fabs(1)', math.fabs(1), 1)
Guido van Rossumfcce6301996-08-08 18:26:25 +0000501
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000502 def testFactorial(self):
Mark Dickinson4c8a9a22010-05-15 17:02:38 +0000503 self.assertEqual(math.factorial(0), 1)
Mark Dickinson4c8a9a22010-05-15 17:02:38 +0000504 total = 1
505 for i in range(1, 1000):
506 total *= i
507 self.assertEqual(math.factorial(i), total)
Mark Dickinson4c8a9a22010-05-15 17:02:38 +0000508 self.assertEqual(math.factorial(i), py_factorial(i))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000509 self.assertRaises(ValueError, math.factorial, -1)
Mark Dickinson5990d282014-04-10 09:29:39 -0400510 self.assertRaises(ValueError, math.factorial, -10**100)
Mark Dickinson5990d282014-04-10 09:29:39 -0400511
Pablo Galindoe9ba3702018-09-03 22:20:06 +0100512 def testFactorialNonIntegers(self):
Serhiy Storchaka231aad32019-06-17 16:57:27 +0300513 with self.assertWarns(DeprecationWarning):
514 self.assertEqual(math.factorial(5.0), 120)
515 with self.assertWarns(DeprecationWarning):
516 self.assertRaises(ValueError, math.factorial, 5.2)
517 with self.assertWarns(DeprecationWarning):
518 self.assertRaises(ValueError, math.factorial, -1.0)
519 with self.assertWarns(DeprecationWarning):
520 self.assertRaises(ValueError, math.factorial, -1e100)
521 self.assertRaises(TypeError, math.factorial, decimal.Decimal('5'))
522 self.assertRaises(TypeError, math.factorial, decimal.Decimal('5.2'))
Pablo Galindoe9ba3702018-09-03 22:20:06 +0100523 self.assertRaises(TypeError, math.factorial, "5")
524
Mark Dickinson5990d282014-04-10 09:29:39 -0400525 # Other implementations may place different upper bounds.
526 @support.cpython_only
527 def testFactorialHugeInputs(self):
Serhiy Storchaka1b8a46d2019-06-17 16:58:32 +0300528 # Currently raises OverflowError for inputs that are too large
Mark Dickinson5990d282014-04-10 09:29:39 -0400529 # to fit into a C long.
530 self.assertRaises(OverflowError, math.factorial, 10**100)
Serhiy Storchaka231aad32019-06-17 16:57:27 +0300531 with self.assertWarns(DeprecationWarning):
532 self.assertRaises(OverflowError, math.factorial, 1e100)
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000533
Thomas Wouters89f507f2006-12-13 04:49:30 +0000534 def testFloor(self):
535 self.assertRaises(TypeError, math.floor)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000536 self.assertEqual(int, type(math.floor(0.5)))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000537 self.ftest('floor(0.5)', math.floor(0.5), 0)
538 self.ftest('floor(1.0)', math.floor(1.0), 1)
539 self.ftest('floor(1.5)', math.floor(1.5), 1)
540 self.ftest('floor(-0.5)', math.floor(-0.5), -1)
541 self.ftest('floor(-1.0)', math.floor(-1.0), -1)
542 self.ftest('floor(-1.5)', math.floor(-1.5), -2)
Guido van Rossum806c2462007-08-06 23:33:07 +0000543 # pow() relies on floor() to check for integers
544 # This fails on some platforms - so check it here
545 self.ftest('floor(1.23e167)', math.floor(1.23e167), 1.23e167)
546 self.ftest('floor(-1.23e167)', math.floor(-1.23e167), -1.23e167)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000547 #self.assertEqual(math.ceil(INF), INF)
548 #self.assertEqual(math.ceil(NINF), NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000549 #self.assertTrue(math.isnan(math.floor(NAN)))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000550
Guido van Rossum13e05de2007-08-23 22:56:55 +0000551 class TestFloor:
552 def __floor__(self):
553 return 42
554 class TestNoFloor:
555 pass
556 self.ftest('floor(TestFloor())', math.floor(TestFloor()), 42)
557 self.assertRaises(TypeError, math.floor, TestNoFloor())
558
559 t = TestNoFloor()
560 t.__floor__ = lambda *args: args
561 self.assertRaises(TypeError, math.floor, t)
562 self.assertRaises(TypeError, math.floor, t, 0)
563
Thomas Wouters89f507f2006-12-13 04:49:30 +0000564 def testFmod(self):
565 self.assertRaises(TypeError, math.fmod)
Mark Dickinson5bc7a442011-05-03 21:13:40 +0100566 self.ftest('fmod(10, 1)', math.fmod(10, 1), 0.0)
567 self.ftest('fmod(10, 0.5)', math.fmod(10, 0.5), 0.0)
568 self.ftest('fmod(10, 1.5)', math.fmod(10, 1.5), 1.0)
569 self.ftest('fmod(-10, 1)', math.fmod(-10, 1), -0.0)
570 self.ftest('fmod(-10, 0.5)', math.fmod(-10, 0.5), -0.0)
571 self.ftest('fmod(-10, 1.5)', math.fmod(-10, 1.5), -1.0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000572 self.assertTrue(math.isnan(math.fmod(NAN, 1.)))
573 self.assertTrue(math.isnan(math.fmod(1., NAN)))
574 self.assertTrue(math.isnan(math.fmod(NAN, NAN)))
Christian Heimes53876d92008-04-19 00:31:39 +0000575 self.assertRaises(ValueError, math.fmod, 1., 0.)
576 self.assertRaises(ValueError, math.fmod, INF, 1.)
577 self.assertRaises(ValueError, math.fmod, NINF, 1.)
578 self.assertRaises(ValueError, math.fmod, INF, 0.)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000579 self.assertEqual(math.fmod(3.0, INF), 3.0)
580 self.assertEqual(math.fmod(-3.0, INF), -3.0)
581 self.assertEqual(math.fmod(3.0, NINF), 3.0)
582 self.assertEqual(math.fmod(-3.0, NINF), -3.0)
583 self.assertEqual(math.fmod(0.0, 3.0), 0.0)
584 self.assertEqual(math.fmod(0.0, NINF), 0.0)
Guido van Rossumfcce6301996-08-08 18:26:25 +0000585
Thomas Wouters89f507f2006-12-13 04:49:30 +0000586 def testFrexp(self):
587 self.assertRaises(TypeError, math.frexp)
Guido van Rossumfcce6301996-08-08 18:26:25 +0000588
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000589 def testfrexp(name, result, expected):
590 (mant, exp), (emant, eexp) = result, expected
Thomas Wouters89f507f2006-12-13 04:49:30 +0000591 if abs(mant-emant) > eps or exp != eexp:
592 self.fail('%s returned %r, expected %r'%\
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000593 (name, result, expected))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000594
Thomas Wouters89f507f2006-12-13 04:49:30 +0000595 testfrexp('frexp(-1)', math.frexp(-1), (-0.5, 1))
596 testfrexp('frexp(0)', math.frexp(0), (0, 0))
597 testfrexp('frexp(1)', math.frexp(1), (0.5, 1))
598 testfrexp('frexp(2)', math.frexp(2), (0.5, 2))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000599
Ezio Melottib3aedd42010-11-20 19:04:17 +0000600 self.assertEqual(math.frexp(INF)[0], INF)
601 self.assertEqual(math.frexp(NINF)[0], NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000602 self.assertTrue(math.isnan(math.frexp(NAN)[0]))
Christian Heimes53876d92008-04-19 00:31:39 +0000603
Mark Dickinson63566232009-09-18 21:04:19 +0000604 @requires_IEEE_754
Mark Dickinson5c567082009-04-24 16:39:07 +0000605 @unittest.skipIf(HAVE_DOUBLE_ROUNDING,
606 "fsum is not exact on machines with double rounding")
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000607 def testFsum(self):
608 # math.fsum relies on exact rounding for correct operation.
609 # There's a known problem with IA32 floating-point that causes
610 # inexact rounding in some situations, and will cause the
611 # math.fsum tests below to fail; see issue #2937. On non IEEE
612 # 754 platforms, and on IEEE 754 platforms that exhibit the
613 # problem described in issue #2937, we simply skip the whole
614 # test.
615
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000616 # Python version of math.fsum, for comparison. Uses a
617 # different algorithm based on frexp, ldexp and integer
618 # arithmetic.
619 from sys import float_info
620 mant_dig = float_info.mant_dig
621 etiny = float_info.min_exp - mant_dig
622
623 def msum(iterable):
624 """Full precision summation. Compute sum(iterable) without any
625 intermediate accumulation of error. Based on the 'lsum' function
626 at http://code.activestate.com/recipes/393090/
627
628 """
629 tmant, texp = 0, 0
630 for x in iterable:
631 mant, exp = math.frexp(x)
632 mant, exp = int(math.ldexp(mant, mant_dig)), exp - mant_dig
633 if texp > exp:
634 tmant <<= texp-exp
635 texp = exp
636 else:
637 mant <<= exp-texp
638 tmant += mant
639 # Round tmant * 2**texp to a float. The original recipe
640 # used float(str(tmant)) * 2.0**texp for this, but that's
641 # a little unsafe because str -> float conversion can't be
642 # relied upon to do correct rounding on all platforms.
643 tail = max(len(bin(abs(tmant)))-2 - mant_dig, etiny - texp)
644 if tail > 0:
645 h = 1 << (tail-1)
646 tmant = tmant // (2*h) + bool(tmant & h and tmant & 3*h-1)
647 texp += tail
648 return math.ldexp(tmant, texp)
649
650 test_values = [
651 ([], 0.0),
652 ([0.0], 0.0),
653 ([1e100, 1.0, -1e100, 1e-100, 1e50, -1.0, -1e50], 1e-100),
654 ([2.0**53, -0.5, -2.0**-54], 2.0**53-1.0),
655 ([2.0**53, 1.0, 2.0**-100], 2.0**53+2.0),
656 ([2.0**53+10.0, 1.0, 2.0**-100], 2.0**53+12.0),
657 ([2.0**53-4.0, 0.5, 2.0**-54], 2.0**53-3.0),
658 ([1./n for n in range(1, 1001)],
659 float.fromhex('0x1.df11f45f4e61ap+2')),
660 ([(-1.)**n/n for n in range(1, 1001)],
661 float.fromhex('-0x1.62a2af1bd3624p-1')),
662 ([1.7**(i+1)-1.7**i for i in range(1000)] + [-1.7**1000], -1.0),
663 ([1e16, 1., 1e-16], 10000000000000002.0),
664 ([1e16-2., 1.-2.**-53, -(1e16-2.), -(1.-2.**-53)], 0.0),
665 # exercise code for resizing partials array
666 ([2.**n - 2.**(n+50) + 2.**(n+52) for n in range(-1074, 972, 2)] +
667 [-2.**1022],
668 float.fromhex('0x1.5555555555555p+970')),
669 ]
670
671 for i, (vals, expected) in enumerate(test_values):
672 try:
673 actual = math.fsum(vals)
674 except OverflowError:
675 self.fail("test %d failed: got OverflowError, expected %r "
676 "for math.fsum(%.100r)" % (i, expected, vals))
677 except ValueError:
678 self.fail("test %d failed: got ValueError, expected %r "
679 "for math.fsum(%.100r)" % (i, expected, vals))
680 self.assertEqual(actual, expected)
681
682 from random import random, gauss, shuffle
683 for j in range(1000):
684 vals = [7, 1e100, -7, -1e100, -9e-20, 8e-20] * 10
685 s = 0
686 for i in range(200):
687 v = gauss(0, random()) ** 7 - s
688 s += v
689 vals.append(v)
690 shuffle(vals)
691
692 s = msum(vals)
693 self.assertEqual(msum(vals), math.fsum(vals))
694
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +0300695 def testGcd(self):
696 gcd = math.gcd
697 self.assertEqual(gcd(0, 0), 0)
698 self.assertEqual(gcd(1, 0), 1)
699 self.assertEqual(gcd(-1, 0), 1)
700 self.assertEqual(gcd(0, 1), 1)
701 self.assertEqual(gcd(0, -1), 1)
702 self.assertEqual(gcd(7, 1), 1)
703 self.assertEqual(gcd(7, -1), 1)
704 self.assertEqual(gcd(-23, 15), 1)
705 self.assertEqual(gcd(120, 84), 12)
706 self.assertEqual(gcd(84, -120), 12)
707 self.assertEqual(gcd(1216342683557601535506311712,
708 436522681849110124616458784), 32)
709 c = 652560
710 x = 434610456570399902378880679233098819019853229470286994367836600566
711 y = 1064502245825115327754847244914921553977
712 a = x * c
713 b = y * c
714 self.assertEqual(gcd(a, b), c)
715 self.assertEqual(gcd(b, a), c)
716 self.assertEqual(gcd(-a, b), c)
717 self.assertEqual(gcd(b, -a), c)
718 self.assertEqual(gcd(a, -b), c)
719 self.assertEqual(gcd(-b, a), c)
720 self.assertEqual(gcd(-a, -b), c)
721 self.assertEqual(gcd(-b, -a), c)
722 c = 576559230871654959816130551884856912003141446781646602790216406874
723 a = x * c
724 b = y * c
725 self.assertEqual(gcd(a, b), c)
726 self.assertEqual(gcd(b, a), c)
727 self.assertEqual(gcd(-a, b), c)
728 self.assertEqual(gcd(b, -a), c)
729 self.assertEqual(gcd(a, -b), c)
730 self.assertEqual(gcd(-b, a), c)
731 self.assertEqual(gcd(-a, -b), c)
732 self.assertEqual(gcd(-b, -a), c)
733
734 self.assertRaises(TypeError, gcd, 120.0, 84)
735 self.assertRaises(TypeError, gcd, 120, 84.0)
736 self.assertEqual(gcd(MyIndexable(120), MyIndexable(84)), 12)
737
Thomas Wouters89f507f2006-12-13 04:49:30 +0000738 def testHypot(self):
Raymond Hettingerc6dabe32018-07-28 07:48:04 -0700739 from decimal import Decimal
740 from fractions import Fraction
741
742 hypot = math.hypot
743
744 # Test different numbers of arguments (from zero to five)
745 # against a straightforward pure python implementation
746 args = math.e, math.pi, math.sqrt(2.0), math.gamma(3.5), math.sin(2.1)
747 for i in range(len(args)+1):
748 self.assertAlmostEqual(
749 hypot(*args[:i]),
750 math.sqrt(sum(s**2 for s in args[:i]))
751 )
752
753 # Test allowable types (those with __float__)
754 self.assertEqual(hypot(12.0, 5.0), 13.0)
755 self.assertEqual(hypot(12, 5), 13)
756 self.assertEqual(hypot(Decimal(12), Decimal(5)), 13)
757 self.assertEqual(hypot(Fraction(12, 32), Fraction(5, 32)), Fraction(13, 32))
758 self.assertEqual(hypot(bool(1), bool(0), bool(1), bool(1)), math.sqrt(3))
759
760 # Test corner cases
761 self.assertEqual(hypot(0.0, 0.0), 0.0) # Max input is zero
762 self.assertEqual(hypot(-10.5), 10.5) # Negative input
763 self.assertEqual(hypot(), 0.0) # Negative input
764 self.assertEqual(1.0,
765 math.copysign(1.0, hypot(-0.0)) # Convert negative zero to positive zero
766 )
Raymond Hettinger00414592018-08-12 12:15:23 -0700767 self.assertEqual( # Handling of moving max to the end
768 hypot(1.5, 1.5, 0.5),
769 hypot(1.5, 0.5, 1.5),
770 )
Raymond Hettingerc6dabe32018-07-28 07:48:04 -0700771
772 # Test handling of bad arguments
773 with self.assertRaises(TypeError): # Reject keyword args
774 hypot(x=1)
775 with self.assertRaises(TypeError): # Reject values without __float__
776 hypot(1.1, 'string', 2.2)
Raymond Hettinger808180c2019-01-28 13:59:56 -0800777 int_too_big_for_float = 10 ** (sys.float_info.max_10_exp + 5)
778 with self.assertRaises((ValueError, OverflowError)):
779 hypot(1, int_too_big_for_float)
Raymond Hettingerc6dabe32018-07-28 07:48:04 -0700780
781 # Any infinity gives positive infinity.
782 self.assertEqual(hypot(INF), INF)
783 self.assertEqual(hypot(0, INF), INF)
784 self.assertEqual(hypot(10, INF), INF)
785 self.assertEqual(hypot(-10, INF), INF)
786 self.assertEqual(hypot(NAN, INF), INF)
787 self.assertEqual(hypot(INF, NAN), INF)
788 self.assertEqual(hypot(NINF, NAN), INF)
789 self.assertEqual(hypot(NAN, NINF), INF)
790 self.assertEqual(hypot(-INF, INF), INF)
791 self.assertEqual(hypot(-INF, -INF), INF)
792 self.assertEqual(hypot(10, -INF), INF)
793
Raymond Hettinger00414592018-08-12 12:15:23 -0700794 # If no infinity, any NaN gives a NaN.
Raymond Hettingerc6dabe32018-07-28 07:48:04 -0700795 self.assertTrue(math.isnan(hypot(NAN)))
796 self.assertTrue(math.isnan(hypot(0, NAN)))
797 self.assertTrue(math.isnan(hypot(NAN, 10)))
798 self.assertTrue(math.isnan(hypot(10, NAN)))
799 self.assertTrue(math.isnan(hypot(NAN, NAN)))
800 self.assertTrue(math.isnan(hypot(NAN)))
801
802 # Verify scaling for extremely large values
803 fourthmax = FLOAT_MAX / 4.0
804 for n in range(32):
805 self.assertEqual(hypot(*([fourthmax]*n)), fourthmax * math.sqrt(n))
806
807 # Verify scaling for extremely small values
808 for exp in range(32):
809 scale = FLOAT_MIN / 2.0 ** exp
810 self.assertEqual(math.hypot(4*scale, 3*scale), 5*scale)
Guido van Rossumfcce6301996-08-08 18:26:25 +0000811
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700812 def testDist(self):
813 from decimal import Decimal as D
814 from fractions import Fraction as F
815
816 dist = math.dist
817 sqrt = math.sqrt
818
Raymond Hettinger808180c2019-01-28 13:59:56 -0800819 # Simple exact cases
820 self.assertEqual(dist((1.0, 2.0, 3.0), (4.0, 2.0, -1.0)), 5.0)
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700821 self.assertEqual(dist((1, 2, 3), (4, 2, -1)), 5.0)
822
823 # Test different numbers of arguments (from zero to nine)
824 # against a straightforward pure python implementation
825 for i in range(9):
826 for j in range(5):
827 p = tuple(random.uniform(-5, 5) for k in range(i))
828 q = tuple(random.uniform(-5, 5) for k in range(i))
829 self.assertAlmostEqual(
830 dist(p, q),
831 sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
832 )
833
834 # Test allowable types (those with __float__)
835 self.assertEqual(dist((14.0, 1.0), (2.0, -4.0)), 13.0)
836 self.assertEqual(dist((14, 1), (2, -4)), 13)
837 self.assertEqual(dist((D(14), D(1)), (D(2), D(-4))), D(13))
838 self.assertEqual(dist((F(14, 32), F(1, 32)), (F(2, 32), F(-4, 32))),
839 F(13, 32))
840 self.assertEqual(dist((True, True, False, True, False),
841 (True, False, True, True, False)),
842 sqrt(2.0))
843
844 # Test corner cases
845 self.assertEqual(dist((13.25, 12.5, -3.25),
846 (13.25, 12.5, -3.25)),
847 0.0) # Distance with self is zero
848 self.assertEqual(dist((), ()), 0.0) # Zero-dimensional case
849 self.assertEqual(1.0, # Convert negative zero to positive zero
850 math.copysign(1.0, dist((-0.0,), (0.0,)))
851 )
852 self.assertEqual(1.0, # Convert negative zero to positive zero
853 math.copysign(1.0, dist((0.0,), (-0.0,)))
854 )
Raymond Hettinger00414592018-08-12 12:15:23 -0700855 self.assertEqual( # Handling of moving max to the end
856 dist((1.5, 1.5, 0.5), (0, 0, 0)),
857 dist((1.5, 0.5, 1.5), (0, 0, 0))
858 )
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700859
860 # Verify tuple subclasses are allowed
Raymond Hettinger00414592018-08-12 12:15:23 -0700861 class T(tuple):
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700862 pass
863 self.assertEqual(dist(T((1, 2, 3)), ((4, 2, -1))), 5.0)
864
865 # Test handling of bad arguments
866 with self.assertRaises(TypeError): # Reject keyword args
867 dist(p=(1, 2, 3), q=(4, 5, 6))
868 with self.assertRaises(TypeError): # Too few args
869 dist((1, 2, 3))
870 with self.assertRaises(TypeError): # Too many args
871 dist((1, 2, 3), (4, 5, 6), (7, 8, 9))
872 with self.assertRaises(TypeError): # Scalars not allowed
873 dist(1, 2)
874 with self.assertRaises(TypeError): # Lists not allowed
875 dist([1, 2, 3], [4, 5, 6])
876 with self.assertRaises(TypeError): # Reject values without __float__
877 dist((1.1, 'string', 2.2), (1, 2, 3))
878 with self.assertRaises(ValueError): # Check dimension agree
879 dist((1, 2, 3, 4), (5, 6, 7))
880 with self.assertRaises(ValueError): # Check dimension agree
881 dist((1, 2, 3), (4, 5, 6, 7))
Ammar Askarcb08a712019-01-12 01:23:41 -0500882 with self.assertRaises(TypeError): # Rejects invalid types
883 dist("abc", "xyz")
Raymond Hettinger808180c2019-01-28 13:59:56 -0800884 int_too_big_for_float = 10 ** (sys.float_info.max_10_exp + 5)
885 with self.assertRaises((ValueError, OverflowError)):
886 dist((1, int_too_big_for_float), (2, 3))
887 with self.assertRaises((ValueError, OverflowError)):
888 dist((2, 3), (1, int_too_big_for_float))
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700889
Raymond Hettinger00414592018-08-12 12:15:23 -0700890 # Verify that the one dimensional case is equivalent to abs()
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700891 for i in range(20):
892 p, q = random.random(), random.random()
893 self.assertEqual(dist((p,), (q,)), abs(p - q))
894
895 # Test special values
896 values = [NINF, -10.5, -0.0, 0.0, 10.5, INF, NAN]
897 for p in itertools.product(values, repeat=3):
898 for q in itertools.product(values, repeat=3):
899 diffs = [px - qx for px, qx in zip(p, q)]
900 if any(map(math.isinf, diffs)):
901 # Any infinite difference gives positive infinity.
902 self.assertEqual(dist(p, q), INF)
903 elif any(map(math.isnan, diffs)):
Raymond Hettinger00414592018-08-12 12:15:23 -0700904 # If no infinity, any NaN gives a NaN.
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700905 self.assertTrue(math.isnan(dist(p, q)))
906
907 # Verify scaling for extremely large values
908 fourthmax = FLOAT_MAX / 4.0
909 for n in range(32):
910 p = (fourthmax,) * n
911 q = (0.0,) * n
912 self.assertEqual(dist(p, q), fourthmax * math.sqrt(n))
913 self.assertEqual(dist(q, p), fourthmax * math.sqrt(n))
914
915 # Verify scaling for extremely small values
916 for exp in range(32):
917 scale = FLOAT_MIN / 2.0 ** exp
918 p = (4*scale, 3*scale)
919 q = (0.0, 0.0)
920 self.assertEqual(math.dist(p, q), 5*scale)
921 self.assertEqual(math.dist(q, p), 5*scale)
922
Mark Dickinson73934b92019-05-18 12:29:50 +0100923 def testIsqrt(self):
924 # Test a variety of inputs, large and small.
925 test_values = (
926 list(range(1000))
927 + list(range(10**6 - 1000, 10**6 + 1000))
Mark Dickinson5c08ce92019-05-19 17:51:56 +0100928 + [2**e + i for e in range(60, 200) for i in range(-40, 40)]
Mark Dickinson73934b92019-05-18 12:29:50 +0100929 + [3**9999, 10**5001]
930 )
931
932 for value in test_values:
933 with self.subTest(value=value):
934 s = math.isqrt(value)
935 self.assertIs(type(s), int)
936 self.assertLessEqual(s*s, value)
937 self.assertLess(value, (s+1)*(s+1))
938
939 # Negative values
940 with self.assertRaises(ValueError):
941 math.isqrt(-1)
942
943 # Integer-like things
944 s = math.isqrt(True)
945 self.assertIs(type(s), int)
946 self.assertEqual(s, 1)
947
948 s = math.isqrt(False)
949 self.assertIs(type(s), int)
950 self.assertEqual(s, 0)
951
952 class IntegerLike(object):
953 def __init__(self, value):
954 self.value = value
955
956 def __index__(self):
957 return self.value
958
959 s = math.isqrt(IntegerLike(1729))
960 self.assertIs(type(s), int)
961 self.assertEqual(s, 41)
962
963 with self.assertRaises(ValueError):
964 math.isqrt(IntegerLike(-3))
965
966 # Non-integer-like things
967 bad_values = [
968 3.5, "a string", decimal.Decimal("3.5"), 3.5j,
969 100.0, -4.0,
970 ]
971 for value in bad_values:
972 with self.subTest(value=value):
973 with self.assertRaises(TypeError):
974 math.isqrt(value)
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700975
Thomas Wouters89f507f2006-12-13 04:49:30 +0000976 def testLdexp(self):
977 self.assertRaises(TypeError, math.ldexp)
978 self.ftest('ldexp(0,1)', math.ldexp(0,1), 0)
979 self.ftest('ldexp(1,1)', math.ldexp(1,1), 2)
980 self.ftest('ldexp(1,-1)', math.ldexp(1,-1), 0.5)
981 self.ftest('ldexp(-1,1)', math.ldexp(-1,1), -2)
Christian Heimes53876d92008-04-19 00:31:39 +0000982 self.assertRaises(OverflowError, math.ldexp, 1., 1000000)
983 self.assertRaises(OverflowError, math.ldexp, -1., 1000000)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000984 self.assertEqual(math.ldexp(1., -1000000), 0.)
985 self.assertEqual(math.ldexp(-1., -1000000), -0.)
986 self.assertEqual(math.ldexp(INF, 30), INF)
987 self.assertEqual(math.ldexp(NINF, -213), NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000988 self.assertTrue(math.isnan(math.ldexp(NAN, 0)))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000989
Alexandre Vassalotti6461e102008-05-15 22:09:29 +0000990 # large second argument
991 for n in [10**5, 10**10, 10**20, 10**40]:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000992 self.assertEqual(math.ldexp(INF, -n), INF)
993 self.assertEqual(math.ldexp(NINF, -n), NINF)
994 self.assertEqual(math.ldexp(1., -n), 0.)
995 self.assertEqual(math.ldexp(-1., -n), -0.)
996 self.assertEqual(math.ldexp(0., -n), 0.)
997 self.assertEqual(math.ldexp(-0., -n), -0.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000998 self.assertTrue(math.isnan(math.ldexp(NAN, -n)))
Alexandre Vassalotti6461e102008-05-15 22:09:29 +0000999
1000 self.assertRaises(OverflowError, math.ldexp, 1., n)
1001 self.assertRaises(OverflowError, math.ldexp, -1., n)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001002 self.assertEqual(math.ldexp(0., n), 0.)
1003 self.assertEqual(math.ldexp(-0., n), -0.)
1004 self.assertEqual(math.ldexp(INF, n), INF)
1005 self.assertEqual(math.ldexp(NINF, n), NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001006 self.assertTrue(math.isnan(math.ldexp(NAN, n)))
Alexandre Vassalotti6461e102008-05-15 22:09:29 +00001007
Thomas Wouters89f507f2006-12-13 04:49:30 +00001008 def testLog(self):
1009 self.assertRaises(TypeError, math.log)
1010 self.ftest('log(1/e)', math.log(1/math.e), -1)
1011 self.ftest('log(1)', math.log(1), 0)
1012 self.ftest('log(e)', math.log(math.e), 1)
1013 self.ftest('log(32,2)', math.log(32,2), 5)
1014 self.ftest('log(10**40, 10)', math.log(10**40, 10), 40)
1015 self.ftest('log(10**40, 10**20)', math.log(10**40, 10**20), 2)
Mark Dickinsonc6037172010-09-29 19:06:36 +00001016 self.ftest('log(10**1000)', math.log(10**1000),
1017 2302.5850929940457)
1018 self.assertRaises(ValueError, math.log, -1.5)
1019 self.assertRaises(ValueError, math.log, -10**1000)
Christian Heimes53876d92008-04-19 00:31:39 +00001020 self.assertRaises(ValueError, math.log, NINF)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001021 self.assertEqual(math.log(INF), INF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001022 self.assertTrue(math.isnan(math.log(NAN)))
Christian Heimes53876d92008-04-19 00:31:39 +00001023
1024 def testLog1p(self):
1025 self.assertRaises(TypeError, math.log1p)
Mark Dickinson31ba1c32016-09-04 12:29:14 +01001026 for n in [2, 2**90, 2**300]:
1027 self.assertAlmostEqual(math.log1p(n), math.log1p(float(n)))
1028 self.assertRaises(ValueError, math.log1p, -1)
1029 self.assertEqual(math.log1p(INF), INF)
Guido van Rossumfcce6301996-08-08 18:26:25 +00001030
Victor Stinnerfa0e3d52011-05-09 01:01:09 +02001031 @requires_IEEE_754
1032 def testLog2(self):
1033 self.assertRaises(TypeError, math.log2)
Victor Stinnerfa0e3d52011-05-09 01:01:09 +02001034
1035 # Check some integer values
1036 self.assertEqual(math.log2(1), 0.0)
1037 self.assertEqual(math.log2(2), 1.0)
1038 self.assertEqual(math.log2(4), 2.0)
1039
1040 # Large integer values
1041 self.assertEqual(math.log2(2**1023), 1023.0)
1042 self.assertEqual(math.log2(2**1024), 1024.0)
1043 self.assertEqual(math.log2(2**2000), 2000.0)
1044
1045 self.assertRaises(ValueError, math.log2, -1.5)
1046 self.assertRaises(ValueError, math.log2, NINF)
1047 self.assertTrue(math.isnan(math.log2(NAN)))
1048
Victor Stinnercd9dd372011-05-10 23:40:17 +02001049 @requires_IEEE_754
Victor Stinnerebbbdaf2011-06-01 13:19:07 +02001050 # log2() is not accurate enough on Mac OS X Tiger (10.4)
1051 @support.requires_mac_ver(10, 5)
Victor Stinnercd9dd372011-05-10 23:40:17 +02001052 def testLog2Exact(self):
1053 # Check that we get exact equality for log2 of powers of 2.
1054 actual = [math.log2(math.ldexp(1.0, n)) for n in range(-1074, 1024)]
1055 expected = [float(n) for n in range(-1074, 1024)]
1056 self.assertEqual(actual, expected)
1057
Thomas Wouters89f507f2006-12-13 04:49:30 +00001058 def testLog10(self):
1059 self.assertRaises(TypeError, math.log10)
1060 self.ftest('log10(0.1)', math.log10(0.1), -1)
1061 self.ftest('log10(1)', math.log10(1), 0)
1062 self.ftest('log10(10)', math.log10(10), 1)
Mark Dickinsonc6037172010-09-29 19:06:36 +00001063 self.ftest('log10(10**1000)', math.log10(10**1000), 1000.0)
1064 self.assertRaises(ValueError, math.log10, -1.5)
1065 self.assertRaises(ValueError, math.log10, -10**1000)
Christian Heimes53876d92008-04-19 00:31:39 +00001066 self.assertRaises(ValueError, math.log10, NINF)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001067 self.assertEqual(math.log(INF), INF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001068 self.assertTrue(math.isnan(math.log10(NAN)))
Guido van Rossumfcce6301996-08-08 18:26:25 +00001069
Thomas Wouters89f507f2006-12-13 04:49:30 +00001070 def testModf(self):
1071 self.assertRaises(TypeError, math.modf)
Guido van Rossumfcce6301996-08-08 18:26:25 +00001072
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001073 def testmodf(name, result, expected):
1074 (v1, v2), (e1, e2) = result, expected
Thomas Wouters89f507f2006-12-13 04:49:30 +00001075 if abs(v1-e1) > eps or abs(v2-e2):
1076 self.fail('%s returned %r, expected %r'%\
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001077 (name, result, expected))
Raymond Hettinger64108af2002-05-13 03:55:01 +00001078
Thomas Wouters89f507f2006-12-13 04:49:30 +00001079 testmodf('modf(1.5)', math.modf(1.5), (0.5, 1.0))
1080 testmodf('modf(-1.5)', math.modf(-1.5), (-0.5, -1.0))
Guido van Rossumfcce6301996-08-08 18:26:25 +00001081
Ezio Melottib3aedd42010-11-20 19:04:17 +00001082 self.assertEqual(math.modf(INF), (0.0, INF))
1083 self.assertEqual(math.modf(NINF), (-0.0, NINF))
Christian Heimes53876d92008-04-19 00:31:39 +00001084
1085 modf_nan = math.modf(NAN)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001086 self.assertTrue(math.isnan(modf_nan[0]))
1087 self.assertTrue(math.isnan(modf_nan[1]))
Christian Heimes53876d92008-04-19 00:31:39 +00001088
Thomas Wouters89f507f2006-12-13 04:49:30 +00001089 def testPow(self):
1090 self.assertRaises(TypeError, math.pow)
1091 self.ftest('pow(0,1)', math.pow(0,1), 0)
1092 self.ftest('pow(1,0)', math.pow(1,0), 1)
1093 self.ftest('pow(2,1)', math.pow(2,1), 2)
1094 self.ftest('pow(2,-1)', math.pow(2,-1), 0.5)
Christian Heimes53876d92008-04-19 00:31:39 +00001095 self.assertEqual(math.pow(INF, 1), INF)
1096 self.assertEqual(math.pow(NINF, 1), NINF)
1097 self.assertEqual((math.pow(1, INF)), 1.)
1098 self.assertEqual((math.pow(1, NINF)), 1.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001099 self.assertTrue(math.isnan(math.pow(NAN, 1)))
1100 self.assertTrue(math.isnan(math.pow(2, NAN)))
1101 self.assertTrue(math.isnan(math.pow(0, NAN)))
Christian Heimes53876d92008-04-19 00:31:39 +00001102 self.assertEqual(math.pow(1, NAN), 1)
Christian Heimesa342c012008-04-20 21:01:16 +00001103
1104 # pow(0., x)
1105 self.assertEqual(math.pow(0., INF), 0.)
1106 self.assertEqual(math.pow(0., 3.), 0.)
1107 self.assertEqual(math.pow(0., 2.3), 0.)
1108 self.assertEqual(math.pow(0., 2.), 0.)
1109 self.assertEqual(math.pow(0., 0.), 1.)
1110 self.assertEqual(math.pow(0., -0.), 1.)
1111 self.assertRaises(ValueError, math.pow, 0., -2.)
1112 self.assertRaises(ValueError, math.pow, 0., -2.3)
1113 self.assertRaises(ValueError, math.pow, 0., -3.)
1114 self.assertRaises(ValueError, math.pow, 0., NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001115 self.assertTrue(math.isnan(math.pow(0., NAN)))
Christian Heimesa342c012008-04-20 21:01:16 +00001116
1117 # pow(INF, x)
1118 self.assertEqual(math.pow(INF, INF), INF)
1119 self.assertEqual(math.pow(INF, 3.), INF)
1120 self.assertEqual(math.pow(INF, 2.3), INF)
1121 self.assertEqual(math.pow(INF, 2.), INF)
1122 self.assertEqual(math.pow(INF, 0.), 1.)
1123 self.assertEqual(math.pow(INF, -0.), 1.)
1124 self.assertEqual(math.pow(INF, -2.), 0.)
1125 self.assertEqual(math.pow(INF, -2.3), 0.)
1126 self.assertEqual(math.pow(INF, -3.), 0.)
1127 self.assertEqual(math.pow(INF, NINF), 0.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001128 self.assertTrue(math.isnan(math.pow(INF, NAN)))
Christian Heimesa342c012008-04-20 21:01:16 +00001129
1130 # pow(-0., x)
1131 self.assertEqual(math.pow(-0., INF), 0.)
1132 self.assertEqual(math.pow(-0., 3.), -0.)
1133 self.assertEqual(math.pow(-0., 2.3), 0.)
1134 self.assertEqual(math.pow(-0., 2.), 0.)
1135 self.assertEqual(math.pow(-0., 0.), 1.)
1136 self.assertEqual(math.pow(-0., -0.), 1.)
1137 self.assertRaises(ValueError, math.pow, -0., -2.)
1138 self.assertRaises(ValueError, math.pow, -0., -2.3)
1139 self.assertRaises(ValueError, math.pow, -0., -3.)
1140 self.assertRaises(ValueError, math.pow, -0., NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001141 self.assertTrue(math.isnan(math.pow(-0., NAN)))
Christian Heimesa342c012008-04-20 21:01:16 +00001142
1143 # pow(NINF, x)
1144 self.assertEqual(math.pow(NINF, INF), INF)
1145 self.assertEqual(math.pow(NINF, 3.), NINF)
1146 self.assertEqual(math.pow(NINF, 2.3), INF)
1147 self.assertEqual(math.pow(NINF, 2.), INF)
1148 self.assertEqual(math.pow(NINF, 0.), 1.)
1149 self.assertEqual(math.pow(NINF, -0.), 1.)
1150 self.assertEqual(math.pow(NINF, -2.), 0.)
1151 self.assertEqual(math.pow(NINF, -2.3), 0.)
1152 self.assertEqual(math.pow(NINF, -3.), -0.)
1153 self.assertEqual(math.pow(NINF, NINF), 0.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001154 self.assertTrue(math.isnan(math.pow(NINF, NAN)))
Christian Heimesa342c012008-04-20 21:01:16 +00001155
1156 # pow(-1, x)
1157 self.assertEqual(math.pow(-1., INF), 1.)
1158 self.assertEqual(math.pow(-1., 3.), -1.)
1159 self.assertRaises(ValueError, math.pow, -1., 2.3)
1160 self.assertEqual(math.pow(-1., 2.), 1.)
1161 self.assertEqual(math.pow(-1., 0.), 1.)
1162 self.assertEqual(math.pow(-1., -0.), 1.)
1163 self.assertEqual(math.pow(-1., -2.), 1.)
1164 self.assertRaises(ValueError, math.pow, -1., -2.3)
1165 self.assertEqual(math.pow(-1., -3.), -1.)
1166 self.assertEqual(math.pow(-1., NINF), 1.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001167 self.assertTrue(math.isnan(math.pow(-1., NAN)))
Christian Heimesa342c012008-04-20 21:01:16 +00001168
1169 # pow(1, x)
1170 self.assertEqual(math.pow(1., INF), 1.)
1171 self.assertEqual(math.pow(1., 3.), 1.)
1172 self.assertEqual(math.pow(1., 2.3), 1.)
1173 self.assertEqual(math.pow(1., 2.), 1.)
1174 self.assertEqual(math.pow(1., 0.), 1.)
1175 self.assertEqual(math.pow(1., -0.), 1.)
1176 self.assertEqual(math.pow(1., -2.), 1.)
1177 self.assertEqual(math.pow(1., -2.3), 1.)
1178 self.assertEqual(math.pow(1., -3.), 1.)
1179 self.assertEqual(math.pow(1., NINF), 1.)
1180 self.assertEqual(math.pow(1., NAN), 1.)
1181
1182 # pow(x, 0) should be 1 for any x
1183 self.assertEqual(math.pow(2.3, 0.), 1.)
1184 self.assertEqual(math.pow(-2.3, 0.), 1.)
1185 self.assertEqual(math.pow(NAN, 0.), 1.)
1186 self.assertEqual(math.pow(2.3, -0.), 1.)
1187 self.assertEqual(math.pow(-2.3, -0.), 1.)
1188 self.assertEqual(math.pow(NAN, -0.), 1.)
1189
1190 # pow(x, y) is invalid if x is negative and y is not integral
1191 self.assertRaises(ValueError, math.pow, -1., 2.3)
1192 self.assertRaises(ValueError, math.pow, -15., -3.1)
1193
1194 # pow(x, NINF)
1195 self.assertEqual(math.pow(1.9, NINF), 0.)
1196 self.assertEqual(math.pow(1.1, NINF), 0.)
1197 self.assertEqual(math.pow(0.9, NINF), INF)
1198 self.assertEqual(math.pow(0.1, NINF), INF)
1199 self.assertEqual(math.pow(-0.1, NINF), INF)
1200 self.assertEqual(math.pow(-0.9, NINF), INF)
1201 self.assertEqual(math.pow(-1.1, NINF), 0.)
1202 self.assertEqual(math.pow(-1.9, NINF), 0.)
1203
1204 # pow(x, INF)
1205 self.assertEqual(math.pow(1.9, INF), INF)
1206 self.assertEqual(math.pow(1.1, INF), INF)
1207 self.assertEqual(math.pow(0.9, INF), 0.)
1208 self.assertEqual(math.pow(0.1, INF), 0.)
1209 self.assertEqual(math.pow(-0.1, INF), 0.)
1210 self.assertEqual(math.pow(-0.9, INF), 0.)
1211 self.assertEqual(math.pow(-1.1, INF), INF)
1212 self.assertEqual(math.pow(-1.9, INF), INF)
1213
1214 # pow(x, y) should work for x negative, y an integer
1215 self.ftest('(-2.)**3.', math.pow(-2.0, 3.0), -8.0)
1216 self.ftest('(-2.)**2.', math.pow(-2.0, 2.0), 4.0)
1217 self.ftest('(-2.)**1.', math.pow(-2.0, 1.0), -2.0)
1218 self.ftest('(-2.)**0.', math.pow(-2.0, 0.0), 1.0)
1219 self.ftest('(-2.)**-0.', math.pow(-2.0, -0.0), 1.0)
1220 self.ftest('(-2.)**-1.', math.pow(-2.0, -1.0), -0.5)
1221 self.ftest('(-2.)**-2.', math.pow(-2.0, -2.0), 0.25)
1222 self.ftest('(-2.)**-3.', math.pow(-2.0, -3.0), -0.125)
1223 self.assertRaises(ValueError, math.pow, -2.0, -0.5)
1224 self.assertRaises(ValueError, math.pow, -2.0, 0.5)
1225
1226 # the following tests have been commented out since they don't
1227 # really belong here: the implementation of ** for floats is
Ezio Melotti13925002011-03-16 11:05:33 +02001228 # independent of the implementation of math.pow
Christian Heimesa342c012008-04-20 21:01:16 +00001229 #self.assertEqual(1**NAN, 1)
1230 #self.assertEqual(1**INF, 1)
1231 #self.assertEqual(1**NINF, 1)
1232 #self.assertEqual(1**0, 1)
1233 #self.assertEqual(1.**NAN, 1)
1234 #self.assertEqual(1.**INF, 1)
1235 #self.assertEqual(1.**NINF, 1)
1236 #self.assertEqual(1.**0, 1)
Guido van Rossumfcce6301996-08-08 18:26:25 +00001237
Thomas Wouters89f507f2006-12-13 04:49:30 +00001238 def testRadians(self):
1239 self.assertRaises(TypeError, math.radians)
1240 self.ftest('radians(180)', math.radians(180), math.pi)
1241 self.ftest('radians(90)', math.radians(90), math.pi/2)
1242 self.ftest('radians(-45)', math.radians(-45), -math.pi/4)
Mark Dickinson31ba1c32016-09-04 12:29:14 +01001243 self.ftest('radians(0)', math.radians(0), 0)
Guido van Rossumfcce6301996-08-08 18:26:25 +00001244
Mark Dickinsona0ce3752017-04-05 18:34:27 +01001245 @requires_IEEE_754
1246 def testRemainder(self):
1247 from fractions import Fraction
1248
1249 def validate_spec(x, y, r):
1250 """
1251 Check that r matches remainder(x, y) according to the IEEE 754
1252 specification. Assumes that x, y and r are finite and y is nonzero.
1253 """
1254 fx, fy, fr = Fraction(x), Fraction(y), Fraction(r)
1255 # r should not exceed y/2 in absolute value
1256 self.assertLessEqual(abs(fr), abs(fy/2))
1257 # x - r should be an exact integer multiple of y
1258 n = (fx - fr) / fy
1259 self.assertEqual(n, int(n))
1260 if abs(fr) == abs(fy/2):
1261 # If |r| == |y/2|, n should be even.
1262 self.assertEqual(n/2, int(n/2))
1263
1264 # triples (x, y, remainder(x, y)) in hexadecimal form.
1265 testcases = [
1266 # Remainders modulo 1, showing the ties-to-even behaviour.
1267 '-4.0 1 -0.0',
1268 '-3.8 1 0.8',
1269 '-3.0 1 -0.0',
1270 '-2.8 1 -0.8',
1271 '-2.0 1 -0.0',
1272 '-1.8 1 0.8',
1273 '-1.0 1 -0.0',
1274 '-0.8 1 -0.8',
1275 '-0.0 1 -0.0',
1276 ' 0.0 1 0.0',
1277 ' 0.8 1 0.8',
1278 ' 1.0 1 0.0',
1279 ' 1.8 1 -0.8',
1280 ' 2.0 1 0.0',
1281 ' 2.8 1 0.8',
1282 ' 3.0 1 0.0',
1283 ' 3.8 1 -0.8',
1284 ' 4.0 1 0.0',
1285
1286 # Reductions modulo 2*pi
1287 '0x0.0p+0 0x1.921fb54442d18p+2 0x0.0p+0',
1288 '0x1.921fb54442d18p+0 0x1.921fb54442d18p+2 0x1.921fb54442d18p+0',
1289 '0x1.921fb54442d17p+1 0x1.921fb54442d18p+2 0x1.921fb54442d17p+1',
1290 '0x1.921fb54442d18p+1 0x1.921fb54442d18p+2 0x1.921fb54442d18p+1',
1291 '0x1.921fb54442d19p+1 0x1.921fb54442d18p+2 -0x1.921fb54442d17p+1',
1292 '0x1.921fb54442d17p+2 0x1.921fb54442d18p+2 -0x0.0000000000001p+2',
1293 '0x1.921fb54442d18p+2 0x1.921fb54442d18p+2 0x0p0',
1294 '0x1.921fb54442d19p+2 0x1.921fb54442d18p+2 0x0.0000000000001p+2',
1295 '0x1.2d97c7f3321d1p+3 0x1.921fb54442d18p+2 0x1.921fb54442d14p+1',
1296 '0x1.2d97c7f3321d2p+3 0x1.921fb54442d18p+2 -0x1.921fb54442d18p+1',
1297 '0x1.2d97c7f3321d3p+3 0x1.921fb54442d18p+2 -0x1.921fb54442d14p+1',
1298 '0x1.921fb54442d17p+3 0x1.921fb54442d18p+2 -0x0.0000000000001p+3',
1299 '0x1.921fb54442d18p+3 0x1.921fb54442d18p+2 0x0p0',
1300 '0x1.921fb54442d19p+3 0x1.921fb54442d18p+2 0x0.0000000000001p+3',
1301 '0x1.f6a7a2955385dp+3 0x1.921fb54442d18p+2 0x1.921fb54442d14p+1',
1302 '0x1.f6a7a2955385ep+3 0x1.921fb54442d18p+2 0x1.921fb54442d18p+1',
1303 '0x1.f6a7a2955385fp+3 0x1.921fb54442d18p+2 -0x1.921fb54442d14p+1',
1304 '0x1.1475cc9eedf00p+5 0x1.921fb54442d18p+2 0x1.921fb54442d10p+1',
1305 '0x1.1475cc9eedf01p+5 0x1.921fb54442d18p+2 -0x1.921fb54442d10p+1',
1306
1307 # Symmetry with respect to signs.
1308 ' 1 0.c 0.4',
1309 '-1 0.c -0.4',
1310 ' 1 -0.c 0.4',
1311 '-1 -0.c -0.4',
1312 ' 1.4 0.c -0.4',
1313 '-1.4 0.c 0.4',
1314 ' 1.4 -0.c -0.4',
1315 '-1.4 -0.c 0.4',
1316
1317 # Huge modulus, to check that the underlying algorithm doesn't
1318 # rely on 2.0 * modulus being representable.
1319 '0x1.dp+1023 0x1.4p+1023 0x0.9p+1023',
1320 '0x1.ep+1023 0x1.4p+1023 -0x0.ap+1023',
1321 '0x1.fp+1023 0x1.4p+1023 -0x0.9p+1023',
1322 ]
1323
1324 for case in testcases:
1325 with self.subTest(case=case):
1326 x_hex, y_hex, expected_hex = case.split()
1327 x = float.fromhex(x_hex)
1328 y = float.fromhex(y_hex)
1329 expected = float.fromhex(expected_hex)
1330 validate_spec(x, y, expected)
1331 actual = math.remainder(x, y)
1332 # Cheap way of checking that the floats are
1333 # as identical as we need them to be.
1334 self.assertEqual(actual.hex(), expected.hex())
1335
1336 # Test tiny subnormal modulus: there's potential for
1337 # getting the implementation wrong here (for example,
1338 # by assuming that modulus/2 is exactly representable).
1339 tiny = float.fromhex('1p-1074') # min +ve subnormal
1340 for n in range(-25, 25):
1341 if n == 0:
1342 continue
1343 y = n * tiny
1344 for m in range(100):
1345 x = m * tiny
1346 actual = math.remainder(x, y)
1347 validate_spec(x, y, actual)
1348 actual = math.remainder(-x, y)
1349 validate_spec(-x, y, actual)
1350
1351 # Special values.
1352 # NaNs should propagate as usual.
1353 for value in [NAN, 0.0, -0.0, 2.0, -2.3, NINF, INF]:
1354 self.assertIsNaN(math.remainder(NAN, value))
1355 self.assertIsNaN(math.remainder(value, NAN))
1356
1357 # remainder(x, inf) is x, for non-nan non-infinite x.
1358 for value in [-2.3, -0.0, 0.0, 2.3]:
1359 self.assertEqual(math.remainder(value, INF), value)
1360 self.assertEqual(math.remainder(value, NINF), value)
1361
1362 # remainder(x, 0) and remainder(infinity, x) for non-NaN x are invalid
1363 # operations according to IEEE 754-2008 7.2(f), and should raise.
1364 for value in [NINF, -2.3, -0.0, 0.0, 2.3, INF]:
1365 with self.assertRaises(ValueError):
1366 math.remainder(INF, value)
1367 with self.assertRaises(ValueError):
1368 math.remainder(NINF, value)
1369 with self.assertRaises(ValueError):
1370 math.remainder(value, 0.0)
1371 with self.assertRaises(ValueError):
1372 math.remainder(value, -0.0)
1373
Thomas Wouters89f507f2006-12-13 04:49:30 +00001374 def testSin(self):
1375 self.assertRaises(TypeError, math.sin)
1376 self.ftest('sin(0)', math.sin(0), 0)
1377 self.ftest('sin(pi/2)', math.sin(math.pi/2), 1)
1378 self.ftest('sin(-pi/2)', math.sin(-math.pi/2), -1)
Christian Heimes53876d92008-04-19 00:31:39 +00001379 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001380 self.assertTrue(math.isnan(math.sin(INF)))
1381 self.assertTrue(math.isnan(math.sin(NINF)))
Christian Heimes53876d92008-04-19 00:31:39 +00001382 except ValueError:
1383 self.assertRaises(ValueError, math.sin, INF)
1384 self.assertRaises(ValueError, math.sin, NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001385 self.assertTrue(math.isnan(math.sin(NAN)))
Guido van Rossumfcce6301996-08-08 18:26:25 +00001386
Thomas Wouters89f507f2006-12-13 04:49:30 +00001387 def testSinh(self):
1388 self.assertRaises(TypeError, math.sinh)
1389 self.ftest('sinh(0)', math.sinh(0), 0)
1390 self.ftest('sinh(1)**2-cosh(1)**2', math.sinh(1)**2-math.cosh(1)**2, -1)
1391 self.ftest('sinh(1)+sinh(-1)', math.sinh(1)+math.sinh(-1), 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001392 self.assertEqual(math.sinh(INF), INF)
1393 self.assertEqual(math.sinh(NINF), NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001394 self.assertTrue(math.isnan(math.sinh(NAN)))
Tim Peters1d120612000-10-12 06:10:25 +00001395
Thomas Wouters89f507f2006-12-13 04:49:30 +00001396 def testSqrt(self):
1397 self.assertRaises(TypeError, math.sqrt)
1398 self.ftest('sqrt(0)', math.sqrt(0), 0)
1399 self.ftest('sqrt(1)', math.sqrt(1), 1)
1400 self.ftest('sqrt(4)', math.sqrt(4), 2)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001401 self.assertEqual(math.sqrt(INF), INF)
Mark Dickinson31ba1c32016-09-04 12:29:14 +01001402 self.assertRaises(ValueError, math.sqrt, -1)
Christian Heimes53876d92008-04-19 00:31:39 +00001403 self.assertRaises(ValueError, math.sqrt, NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001404 self.assertTrue(math.isnan(math.sqrt(NAN)))
Tim Peters1d120612000-10-12 06:10:25 +00001405
Thomas Wouters89f507f2006-12-13 04:49:30 +00001406 def testTan(self):
1407 self.assertRaises(TypeError, math.tan)
1408 self.ftest('tan(0)', math.tan(0), 0)
1409 self.ftest('tan(pi/4)', math.tan(math.pi/4), 1)
1410 self.ftest('tan(-pi/4)', math.tan(-math.pi/4), -1)
Christian Heimes53876d92008-04-19 00:31:39 +00001411 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001412 self.assertTrue(math.isnan(math.tan(INF)))
1413 self.assertTrue(math.isnan(math.tan(NINF)))
Christian Heimes53876d92008-04-19 00:31:39 +00001414 except:
1415 self.assertRaises(ValueError, math.tan, INF)
1416 self.assertRaises(ValueError, math.tan, NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001417 self.assertTrue(math.isnan(math.tan(NAN)))
Tim Peters1d120612000-10-12 06:10:25 +00001418
Thomas Wouters89f507f2006-12-13 04:49:30 +00001419 def testTanh(self):
1420 self.assertRaises(TypeError, math.tanh)
1421 self.ftest('tanh(0)', math.tanh(0), 0)
Mark Dickinson96f774d2016-09-03 19:30:22 +01001422 self.ftest('tanh(1)+tanh(-1)', math.tanh(1)+math.tanh(-1), 0,
1423 abs_tol=ulp(1))
Christian Heimes53876d92008-04-19 00:31:39 +00001424 self.ftest('tanh(inf)', math.tanh(INF), 1)
1425 self.ftest('tanh(-inf)', math.tanh(NINF), -1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001426 self.assertTrue(math.isnan(math.tanh(NAN)))
Victor Stinnerbe3da382010-11-07 14:14:27 +00001427
1428 @requires_IEEE_754
Victor Stinnerbe3da382010-11-07 14:14:27 +00001429 def testTanhSign(self):
Christian Heimese57950f2008-04-21 13:08:03 +00001430 # check that tanh(-0.) == -0. on IEEE 754 systems
Victor Stinnerbe3da382010-11-07 14:14:27 +00001431 self.assertEqual(math.tanh(-0.), -0.)
1432 self.assertEqual(math.copysign(1., math.tanh(-0.)),
1433 math.copysign(1., -0.))
Tim Peters1d120612000-10-12 06:10:25 +00001434
Christian Heimes400adb02008-02-01 08:12:03 +00001435 def test_trunc(self):
1436 self.assertEqual(math.trunc(1), 1)
1437 self.assertEqual(math.trunc(-1), -1)
1438 self.assertEqual(type(math.trunc(1)), int)
1439 self.assertEqual(type(math.trunc(1.5)), int)
1440 self.assertEqual(math.trunc(1.5), 1)
1441 self.assertEqual(math.trunc(-1.5), -1)
1442 self.assertEqual(math.trunc(1.999999), 1)
1443 self.assertEqual(math.trunc(-1.999999), -1)
1444 self.assertEqual(math.trunc(-0.999999), -0)
1445 self.assertEqual(math.trunc(-100.999), -100)
1446
1447 class TestTrunc(object):
1448 def __trunc__(self):
1449 return 23
1450
1451 class TestNoTrunc(object):
1452 pass
1453
1454 self.assertEqual(math.trunc(TestTrunc()), 23)
1455
1456 self.assertRaises(TypeError, math.trunc)
1457 self.assertRaises(TypeError, math.trunc, 1, 2)
1458 self.assertRaises(TypeError, math.trunc, TestNoTrunc())
1459
Mark Dickinson8e0c9962010-07-11 17:38:24 +00001460 def testIsfinite(self):
1461 self.assertTrue(math.isfinite(0.0))
1462 self.assertTrue(math.isfinite(-0.0))
1463 self.assertTrue(math.isfinite(1.0))
1464 self.assertTrue(math.isfinite(-1.0))
1465 self.assertFalse(math.isfinite(float("nan")))
1466 self.assertFalse(math.isfinite(float("inf")))
1467 self.assertFalse(math.isfinite(float("-inf")))
1468
Christian Heimes072c0f12008-01-03 23:01:04 +00001469 def testIsnan(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001470 self.assertTrue(math.isnan(float("nan")))
Mark Dickinson31ba1c32016-09-04 12:29:14 +01001471 self.assertTrue(math.isnan(float("-nan")))
1472 self.assertTrue(math.isnan(float("inf") * 0.))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001473 self.assertFalse(math.isnan(float("inf")))
1474 self.assertFalse(math.isnan(0.))
1475 self.assertFalse(math.isnan(1.))
Christian Heimes072c0f12008-01-03 23:01:04 +00001476
1477 def testIsinf(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001478 self.assertTrue(math.isinf(float("inf")))
1479 self.assertTrue(math.isinf(float("-inf")))
1480 self.assertTrue(math.isinf(1E400))
1481 self.assertTrue(math.isinf(-1E400))
1482 self.assertFalse(math.isinf(float("nan")))
1483 self.assertFalse(math.isinf(0.))
1484 self.assertFalse(math.isinf(1.))
Christian Heimes072c0f12008-01-03 23:01:04 +00001485
Mark Dickinsona5d0c7c2015-01-11 11:55:29 +00001486 @requires_IEEE_754
1487 def test_nan_constant(self):
1488 self.assertTrue(math.isnan(math.nan))
1489
1490 @requires_IEEE_754
1491 def test_inf_constant(self):
1492 self.assertTrue(math.isinf(math.inf))
1493 self.assertGreater(math.inf, 0.0)
1494 self.assertEqual(math.inf, float("inf"))
1495 self.assertEqual(-math.inf, float("-inf"))
1496
Thomas Wouters89f507f2006-12-13 04:49:30 +00001497 # RED_FLAG 16-Oct-2000 Tim
1498 # While 2.0 is more consistent about exceptions than previous releases, it
1499 # still fails this part of the test on some platforms. For now, we only
1500 # *run* test_exceptions() in verbose mode, so that this isn't normally
1501 # tested.
Serhiy Storchaka43767632013-11-03 21:31:38 +02001502 @unittest.skipUnless(verbose, 'requires verbose mode')
1503 def test_exceptions(self):
1504 try:
1505 x = math.exp(-1000000000)
1506 except:
1507 # mathmodule.c is failing to weed out underflows from libm, or
1508 # we've got an fp format with huge dynamic range
1509 self.fail("underflowing exp() should not have raised "
1510 "an exception")
1511 if x != 0:
1512 self.fail("underflowing exp() should have returned 0")
Tim Peters98c81842000-10-16 17:35:13 +00001513
Serhiy Storchaka43767632013-11-03 21:31:38 +02001514 # If this fails, probably using a strict IEEE-754 conforming libm, and x
1515 # is +Inf afterwards. But Python wants overflows detected by default.
1516 try:
1517 x = math.exp(1000000000)
1518 except OverflowError:
1519 pass
1520 else:
1521 self.fail("overflowing exp() didn't trigger OverflowError")
Thomas Wouters89f507f2006-12-13 04:49:30 +00001522
Serhiy Storchaka43767632013-11-03 21:31:38 +02001523 # If this fails, it could be a puzzle. One odd possibility is that
1524 # mathmodule.c's macros are getting confused while comparing
1525 # Inf (HUGE_VAL) to a NaN, and artificially setting errno to ERANGE
1526 # as a result (and so raising OverflowError instead).
1527 try:
1528 x = math.sqrt(-1.0)
1529 except ValueError:
1530 pass
1531 else:
1532 self.fail("sqrt(-1) didn't raise ValueError")
Thomas Wouters89f507f2006-12-13 04:49:30 +00001533
Mark Dickinson63566232009-09-18 21:04:19 +00001534 @requires_IEEE_754
Christian Heimes53876d92008-04-19 00:31:39 +00001535 def test_testfile(self):
Mark Dickinson85746542016-09-04 09:58:51 +01001536 # Some tests need to be skipped on ancient OS X versions.
1537 # See issue #27953.
1538 SKIP_ON_TIGER = {'tan0064'}
1539
1540 osx_version = None
1541 if sys.platform == 'darwin':
1542 version_txt = platform.mac_ver()[0]
1543 try:
1544 osx_version = tuple(map(int, version_txt.split('.')))
1545 except ValueError:
1546 pass
1547
Mark Dickinson96f774d2016-09-03 19:30:22 +01001548 fail_fmt = "{}: {}({!r}): {}"
1549
1550 failures = []
Christian Heimes53876d92008-04-19 00:31:39 +00001551 for id, fn, ar, ai, er, ei, flags in parse_testfile(test_file):
Mark Dickinson96f774d2016-09-03 19:30:22 +01001552 # Skip if either the input or result is complex
1553 if ai != 0.0 or ei != 0.0:
Christian Heimes53876d92008-04-19 00:31:39 +00001554 continue
1555 if fn in ['rect', 'polar']:
1556 # no real versions of rect, polar
1557 continue
Mark Dickinson85746542016-09-04 09:58:51 +01001558 # Skip certain tests on OS X 10.4.
1559 if osx_version is not None and osx_version < (10, 5):
1560 if id in SKIP_ON_TIGER:
1561 continue
Mark Dickinson96f774d2016-09-03 19:30:22 +01001562
Christian Heimes53876d92008-04-19 00:31:39 +00001563 func = getattr(math, fn)
Mark Dickinson96f774d2016-09-03 19:30:22 +01001564
1565 if 'invalid' in flags or 'divide-by-zero' in flags:
1566 er = 'ValueError'
1567 elif 'overflow' in flags:
1568 er = 'OverflowError'
1569
Christian Heimesa342c012008-04-20 21:01:16 +00001570 try:
1571 result = func(ar)
Mark Dickinson96f774d2016-09-03 19:30:22 +01001572 except ValueError:
1573 result = 'ValueError'
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001574 except OverflowError:
Mark Dickinson96f774d2016-09-03 19:30:22 +01001575 result = 'OverflowError'
1576
1577 # Default tolerances
1578 ulp_tol, abs_tol = 5, 0.0
1579
1580 failure = result_check(er, result, ulp_tol, abs_tol)
1581 if failure is None:
1582 continue
1583
1584 msg = fail_fmt.format(id, fn, ar, failure)
1585 failures.append(msg)
1586
1587 if failures:
1588 self.fail('Failures in test_testfile:\n ' +
1589 '\n '.join(failures))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001590
Victor Stinnerbe3da382010-11-07 14:14:27 +00001591 @requires_IEEE_754
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001592 def test_mtestfile(self):
Mark Dickinson96f774d2016-09-03 19:30:22 +01001593 fail_fmt = "{}: {}({!r}): {}"
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001594
1595 failures = []
1596 for id, fn, arg, expected, flags in parse_mtestfile(math_testcases):
1597 func = getattr(math, fn)
1598
1599 if 'invalid' in flags or 'divide-by-zero' in flags:
1600 expected = 'ValueError'
1601 elif 'overflow' in flags:
1602 expected = 'OverflowError'
1603
1604 try:
1605 got = func(arg)
1606 except ValueError:
1607 got = 'ValueError'
1608 except OverflowError:
1609 got = 'OverflowError'
1610
Mark Dickinson96f774d2016-09-03 19:30:22 +01001611 # Default tolerances
1612 ulp_tol, abs_tol = 5, 0.0
Mark Dickinsonbcdf9da2010-06-13 10:52:38 +00001613
Mark Dickinson96f774d2016-09-03 19:30:22 +01001614 # Exceptions to the defaults
1615 if fn == 'gamma':
1616 # Experimental results on one platform gave
1617 # an accuracy of <= 10 ulps across the entire float
1618 # domain. We weaken that to require 20 ulp accuracy.
1619 ulp_tol = 20
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001620
Mark Dickinson96f774d2016-09-03 19:30:22 +01001621 elif fn == 'lgamma':
1622 # we use a weaker accuracy test for lgamma;
1623 # lgamma only achieves an absolute error of
1624 # a few multiples of the machine accuracy, in
1625 # general.
1626 abs_tol = 1e-15
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001627
Mark Dickinson96f774d2016-09-03 19:30:22 +01001628 elif fn == 'erfc' and arg >= 0.0:
1629 # erfc has less-than-ideal accuracy for large
1630 # arguments (x ~ 25 or so), mainly due to the
1631 # error involved in computing exp(-x*x).
1632 #
1633 # Observed between CPython and mpmath at 25 dp:
1634 # x < 0 : err <= 2 ulp
1635 # 0 <= x < 1 : err <= 10 ulp
1636 # 1 <= x < 10 : err <= 100 ulp
1637 # 10 <= x < 20 : err <= 300 ulp
1638 # 20 <= x : < 600 ulp
1639 #
1640 if arg < 1.0:
1641 ulp_tol = 10
1642 elif arg < 10.0:
1643 ulp_tol = 100
1644 else:
1645 ulp_tol = 1000
1646
1647 failure = result_check(expected, got, ulp_tol, abs_tol)
1648 if failure is None:
1649 continue
1650
1651 msg = fail_fmt.format(id, fn, arg, failure)
1652 failures.append(msg)
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001653
1654 if failures:
1655 self.fail('Failures in test_mtestfile:\n ' +
1656 '\n '.join(failures))
1657
Pablo Galindo04114112019-03-09 19:18:08 +00001658 def test_prod(self):
1659 prod = math.prod
1660 self.assertEqual(prod([]), 1)
1661 self.assertEqual(prod([], start=5), 5)
1662 self.assertEqual(prod(list(range(2,8))), 5040)
1663 self.assertEqual(prod(iter(list(range(2,8)))), 5040)
1664 self.assertEqual(prod(range(1, 10), start=10), 3628800)
1665
1666 self.assertEqual(prod([1, 2, 3, 4, 5]), 120)
1667 self.assertEqual(prod([1.0, 2.0, 3.0, 4.0, 5.0]), 120.0)
1668 self.assertEqual(prod([1, 2, 3, 4.0, 5.0]), 120.0)
1669 self.assertEqual(prod([1.0, 2.0, 3.0, 4, 5]), 120.0)
1670
1671 # Test overflow in fast-path for integers
1672 self.assertEqual(prod([1, 1, 2**32, 1, 1]), 2**32)
1673 # Test overflow in fast-path for floats
1674 self.assertEqual(prod([1.0, 1.0, 2**32, 1, 1]), float(2**32))
1675
1676 self.assertRaises(TypeError, prod)
1677 self.assertRaises(TypeError, prod, 42)
1678 self.assertRaises(TypeError, prod, ['a', 'b', 'c'])
1679 self.assertRaises(TypeError, prod, ['a', 'b', 'c'], '')
1680 self.assertRaises(TypeError, prod, [b'a', b'c'], b'')
1681 values = [bytearray(b'a'), bytearray(b'b')]
1682 self.assertRaises(TypeError, prod, values, bytearray(b''))
1683 self.assertRaises(TypeError, prod, [[1], [2], [3]])
1684 self.assertRaises(TypeError, prod, [{2:3}])
1685 self.assertRaises(TypeError, prod, [{2:3}]*2, {2:3})
1686 self.assertRaises(TypeError, prod, [[1], [2], [3]], [])
1687 with self.assertRaises(TypeError):
1688 prod([10, 20], [30, 40]) # start is a keyword-only argument
1689
1690 self.assertEqual(prod([0, 1, 2, 3]), 0)
1691 self.assertEqual(prod([1, 0, 2, 3]), 0)
1692 self.assertEqual(prod([1, 2, 3, 0]), 0)
1693
1694 def _naive_prod(iterable, start=1):
1695 for elem in iterable:
1696 start *= elem
1697 return start
1698
1699 # Big integers
1700
1701 iterable = range(1, 10000)
1702 self.assertEqual(prod(iterable), _naive_prod(iterable))
1703 iterable = range(-10000, -1)
1704 self.assertEqual(prod(iterable), _naive_prod(iterable))
1705 iterable = range(-1000, 1000)
1706 self.assertEqual(prod(iterable), 0)
1707
1708 # Big floats
1709
1710 iterable = [float(x) for x in range(1, 1000)]
1711 self.assertEqual(prod(iterable), _naive_prod(iterable))
1712 iterable = [float(x) for x in range(-1000, -1)]
1713 self.assertEqual(prod(iterable), _naive_prod(iterable))
1714 iterable = [float(x) for x in range(-1000, 1000)]
1715 self.assertIsNaN(prod(iterable))
1716
1717 # Float tests
1718
1719 self.assertIsNaN(prod([1, 2, 3, float("nan"), 2, 3]))
1720 self.assertIsNaN(prod([1, 0, float("nan"), 2, 3]))
1721 self.assertIsNaN(prod([1, float("nan"), 0, 3]))
1722 self.assertIsNaN(prod([1, float("inf"), float("nan"),3]))
1723 self.assertIsNaN(prod([1, float("-inf"), float("nan"),3]))
1724 self.assertIsNaN(prod([1, float("nan"), float("inf"),3]))
1725 self.assertIsNaN(prod([1, float("nan"), float("-inf"),3]))
1726
1727 self.assertEqual(prod([1, 2, 3, float('inf'),-3,4]), float('-inf'))
1728 self.assertEqual(prod([1, 2, 3, float('-inf'),-3,4]), float('inf'))
1729
1730 self.assertIsNaN(prod([1,2,0,float('inf'), -3, 4]))
1731 self.assertIsNaN(prod([1,2,0,float('-inf'), -3, 4]))
1732 self.assertIsNaN(prod([1, 2, 3, float('inf'), -3, 0, 3]))
1733 self.assertIsNaN(prod([1, 2, 3, float('-inf'), -3, 0, 2]))
1734
1735 # Type preservation
1736
1737 self.assertEqual(type(prod([1, 2, 3, 4, 5, 6])), int)
1738 self.assertEqual(type(prod([1, 2.0, 3, 4, 5, 6])), float)
1739 self.assertEqual(type(prod(range(1, 10000))), int)
1740 self.assertEqual(type(prod(range(1, 10000), start=1.0)), float)
1741 self.assertEqual(type(prod([1, decimal.Decimal(2.0), 3, 4, 5, 6])),
1742 decimal.Decimal)
1743
Mark Dickinsona0ce3752017-04-05 18:34:27 +01001744 # Custom assertions.
1745
1746 def assertIsNaN(self, value):
1747 if not math.isnan(value):
1748 self.fail("Expected a NaN, got {!r}.".format(value))
1749
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001750
Tal Einatd5519ed2015-05-31 22:05:00 +03001751class IsCloseTests(unittest.TestCase):
Mike53f7a7c2017-12-14 14:04:53 +03001752 isclose = math.isclose # subclasses should override this
Tal Einatd5519ed2015-05-31 22:05:00 +03001753
1754 def assertIsClose(self, a, b, *args, **kwargs):
1755 self.assertTrue(self.isclose(a, b, *args, **kwargs),
1756 msg="%s and %s should be close!" % (a, b))
1757
1758 def assertIsNotClose(self, a, b, *args, **kwargs):
1759 self.assertFalse(self.isclose(a, b, *args, **kwargs),
1760 msg="%s and %s should not be close!" % (a, b))
1761
1762 def assertAllClose(self, examples, *args, **kwargs):
1763 for a, b in examples:
1764 self.assertIsClose(a, b, *args, **kwargs)
1765
1766 def assertAllNotClose(self, examples, *args, **kwargs):
1767 for a, b in examples:
1768 self.assertIsNotClose(a, b, *args, **kwargs)
1769
1770 def test_negative_tolerances(self):
1771 # ValueError should be raised if either tolerance is less than zero
1772 with self.assertRaises(ValueError):
1773 self.assertIsClose(1, 1, rel_tol=-1e-100)
1774 with self.assertRaises(ValueError):
1775 self.assertIsClose(1, 1, rel_tol=1e-100, abs_tol=-1e10)
1776
1777 def test_identical(self):
1778 # identical values must test as close
1779 identical_examples = [(2.0, 2.0),
1780 (0.1e200, 0.1e200),
1781 (1.123e-300, 1.123e-300),
1782 (12345, 12345.0),
1783 (0.0, -0.0),
1784 (345678, 345678)]
1785 self.assertAllClose(identical_examples, rel_tol=0.0, abs_tol=0.0)
1786
1787 def test_eight_decimal_places(self):
1788 # examples that are close to 1e-8, but not 1e-9
1789 eight_decimal_places_examples = [(1e8, 1e8 + 1),
1790 (-1e-8, -1.000000009e-8),
1791 (1.12345678, 1.12345679)]
1792 self.assertAllClose(eight_decimal_places_examples, rel_tol=1e-8)
1793 self.assertAllNotClose(eight_decimal_places_examples, rel_tol=1e-9)
1794
1795 def test_near_zero(self):
1796 # values close to zero
1797 near_zero_examples = [(1e-9, 0.0),
1798 (-1e-9, 0.0),
1799 (-1e-150, 0.0)]
1800 # these should not be close to any rel_tol
1801 self.assertAllNotClose(near_zero_examples, rel_tol=0.9)
1802 # these should be close to abs_tol=1e-8
1803 self.assertAllClose(near_zero_examples, abs_tol=1e-8)
1804
1805 def test_identical_infinite(self):
1806 # these are close regardless of tolerance -- i.e. they are equal
1807 self.assertIsClose(INF, INF)
1808 self.assertIsClose(INF, INF, abs_tol=0.0)
1809 self.assertIsClose(NINF, NINF)
1810 self.assertIsClose(NINF, NINF, abs_tol=0.0)
1811
1812 def test_inf_ninf_nan(self):
1813 # these should never be close (following IEEE 754 rules for equality)
1814 not_close_examples = [(NAN, NAN),
1815 (NAN, 1e-100),
1816 (1e-100, NAN),
1817 (INF, NAN),
1818 (NAN, INF),
1819 (INF, NINF),
1820 (INF, 1.0),
1821 (1.0, INF),
1822 (INF, 1e308),
1823 (1e308, INF)]
1824 # use largest reasonable tolerance
1825 self.assertAllNotClose(not_close_examples, abs_tol=0.999999999999999)
1826
1827 def test_zero_tolerance(self):
1828 # test with zero tolerance
1829 zero_tolerance_close_examples = [(1.0, 1.0),
1830 (-3.4, -3.4),
1831 (-1e-300, -1e-300)]
1832 self.assertAllClose(zero_tolerance_close_examples, rel_tol=0.0)
1833
1834 zero_tolerance_not_close_examples = [(1.0, 1.000000000000001),
1835 (0.99999999999999, 1.0),
1836 (1.0e200, .999999999999999e200)]
1837 self.assertAllNotClose(zero_tolerance_not_close_examples, rel_tol=0.0)
1838
Martin Pantereb995702016-07-28 01:11:04 +00001839 def test_asymmetry(self):
1840 # test the asymmetry example from PEP 485
Tal Einatd5519ed2015-05-31 22:05:00 +03001841 self.assertAllClose([(9, 10), (10, 9)], rel_tol=0.1)
1842
1843 def test_integers(self):
1844 # test with integer values
1845 integer_examples = [(100000001, 100000000),
1846 (123456789, 123456788)]
1847
1848 self.assertAllClose(integer_examples, rel_tol=1e-8)
1849 self.assertAllNotClose(integer_examples, rel_tol=1e-9)
1850
1851 def test_decimals(self):
1852 # test with Decimal values
1853 from decimal import Decimal
1854
1855 decimal_examples = [(Decimal('1.00000001'), Decimal('1.0')),
1856 (Decimal('1.00000001e-20'), Decimal('1.0e-20')),
Mark Dickinson31ba1c32016-09-04 12:29:14 +01001857 (Decimal('1.00000001e-100'), Decimal('1.0e-100')),
1858 (Decimal('1.00000001e20'), Decimal('1.0e20'))]
Tal Einatd5519ed2015-05-31 22:05:00 +03001859 self.assertAllClose(decimal_examples, rel_tol=1e-8)
1860 self.assertAllNotClose(decimal_examples, rel_tol=1e-9)
1861
1862 def test_fractions(self):
1863 # test with Fraction values
1864 from fractions import Fraction
1865
Mark Dickinson31ba1c32016-09-04 12:29:14 +01001866 fraction_examples = [
1867 (Fraction(1, 100000000) + 1, Fraction(1)),
1868 (Fraction(100000001), Fraction(100000000)),
1869 (Fraction(10**8 + 1, 10**28), Fraction(1, 10**20))]
Tal Einatd5519ed2015-05-31 22:05:00 +03001870 self.assertAllClose(fraction_examples, rel_tol=1e-8)
1871 self.assertAllNotClose(fraction_examples, rel_tol=1e-9)
1872
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001873 def testPerm(self):
1874 perm = math.perm
1875 factorial = math.factorial
1876 # Test if factorial defintion is satisfied
1877 for n in range(100):
1878 for k in range(n + 1):
1879 self.assertEqual(perm(n, k),
1880 factorial(n) // factorial(n - k))
1881
1882 # Test for Pascal's identity
1883 for n in range(1, 100):
1884 for k in range(1, n):
1885 self.assertEqual(perm(n, k), perm(n - 1, k - 1) * k + perm(n - 1, k))
1886
1887 # Test corner cases
1888 for n in range(1, 100):
1889 self.assertEqual(perm(n, 0), 1)
1890 self.assertEqual(perm(n, 1), n)
1891 self.assertEqual(perm(n, n), factorial(n))
1892
Raymond Hettingere119b3d2019-06-08 08:58:11 -07001893 # Test one argument form
1894 for n in range(20):
1895 self.assertEqual(perm(n), factorial(n))
1896 self.assertEqual(perm(n, None), factorial(n))
1897
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001898 # Raises TypeError if any argument is non-integer or argument count is
Raymond Hettingere119b3d2019-06-08 08:58:11 -07001899 # not 1 or 2
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001900 self.assertRaises(TypeError, perm, 10, 1.0)
1901 self.assertRaises(TypeError, perm, 10, decimal.Decimal(1.0))
1902 self.assertRaises(TypeError, perm, 10, "1")
1903 self.assertRaises(TypeError, perm, 10.0, 1)
1904 self.assertRaises(TypeError, perm, decimal.Decimal(10.0), 1)
1905 self.assertRaises(TypeError, perm, "10", 1)
1906
Raymond Hettingere119b3d2019-06-08 08:58:11 -07001907 self.assertRaises(TypeError, perm)
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001908 self.assertRaises(TypeError, perm, 10, 1, 3)
1909 self.assertRaises(TypeError, perm)
1910
1911 # Raises Value error if not k or n are negative numbers
1912 self.assertRaises(ValueError, perm, -1, 1)
1913 self.assertRaises(ValueError, perm, -2**1000, 1)
1914 self.assertRaises(ValueError, perm, 1, -1)
1915 self.assertRaises(ValueError, perm, 1, -2**1000)
1916
Raymond Hettinger963eb0f2019-06-04 01:23:06 -07001917 # Returns zero if k is greater than n
1918 self.assertEqual(perm(1, 2), 0)
1919 self.assertEqual(perm(1, 2**1000), 0)
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001920
1921 n = 2**1000
1922 self.assertEqual(perm(n, 0), 1)
1923 self.assertEqual(perm(n, 1), n)
1924 self.assertEqual(perm(n, 2), n * (n-1))
Serhiy Storchaka1b8a46d2019-06-17 16:58:32 +03001925 if support.check_impl_detail(cpython=True):
1926 self.assertRaises(OverflowError, perm, n, n)
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001927
1928 for n, k in (True, True), (True, False), (False, False):
1929 self.assertEqual(perm(n, k), 1)
1930 self.assertIs(type(perm(n, k)), int)
1931 self.assertEqual(perm(IntSubclass(5), IntSubclass(2)), 20)
1932 self.assertEqual(perm(MyIndexable(5), MyIndexable(2)), 20)
1933 for k in range(3):
1934 self.assertIs(type(perm(IntSubclass(5), IntSubclass(k))), int)
1935 self.assertIs(type(perm(MyIndexable(5), MyIndexable(k))), int)
1936
Yash Aggarwal4a686502019-06-01 12:51:27 +05301937 def testComb(self):
1938 comb = math.comb
1939 factorial = math.factorial
1940 # Test if factorial defintion is satisfied
1941 for n in range(100):
1942 for k in range(n + 1):
1943 self.assertEqual(comb(n, k), factorial(n)
1944 // (factorial(k) * factorial(n - k)))
1945
1946 # Test for Pascal's identity
1947 for n in range(1, 100):
1948 for k in range(1, n):
1949 self.assertEqual(comb(n, k), comb(n - 1, k - 1) + comb(n - 1, k))
1950
1951 # Test corner cases
1952 for n in range(100):
1953 self.assertEqual(comb(n, 0), 1)
1954 self.assertEqual(comb(n, n), 1)
1955
1956 for n in range(1, 100):
1957 self.assertEqual(comb(n, 1), n)
1958 self.assertEqual(comb(n, n - 1), n)
1959
1960 # Test Symmetry
1961 for n in range(100):
1962 for k in range(n // 2):
1963 self.assertEqual(comb(n, k), comb(n, n - k))
1964
1965 # Raises TypeError if any argument is non-integer or argument count is
1966 # not 2
1967 self.assertRaises(TypeError, comb, 10, 1.0)
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001968 self.assertRaises(TypeError, comb, 10, decimal.Decimal(1.0))
Yash Aggarwal4a686502019-06-01 12:51:27 +05301969 self.assertRaises(TypeError, comb, 10, "1")
Yash Aggarwal4a686502019-06-01 12:51:27 +05301970 self.assertRaises(TypeError, comb, 10.0, 1)
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001971 self.assertRaises(TypeError, comb, decimal.Decimal(10.0), 1)
1972 self.assertRaises(TypeError, comb, "10", 1)
Yash Aggarwal4a686502019-06-01 12:51:27 +05301973
1974 self.assertRaises(TypeError, comb, 10)
1975 self.assertRaises(TypeError, comb, 10, 1, 3)
1976 self.assertRaises(TypeError, comb)
1977
1978 # Raises Value error if not k or n are negative numbers
1979 self.assertRaises(ValueError, comb, -1, 1)
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001980 self.assertRaises(ValueError, comb, -2**1000, 1)
Yash Aggarwal4a686502019-06-01 12:51:27 +05301981 self.assertRaises(ValueError, comb, 1, -1)
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001982 self.assertRaises(ValueError, comb, 1, -2**1000)
Yash Aggarwal4a686502019-06-01 12:51:27 +05301983
Raymond Hettinger963eb0f2019-06-04 01:23:06 -07001984 # Returns zero if k is greater than n
1985 self.assertEqual(comb(1, 2), 0)
1986 self.assertEqual(comb(1, 2**1000), 0)
Yash Aggarwal4a686502019-06-01 12:51:27 +05301987
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001988 n = 2**1000
1989 self.assertEqual(comb(n, 0), 1)
1990 self.assertEqual(comb(n, 1), n)
1991 self.assertEqual(comb(n, 2), n * (n-1) // 2)
1992 self.assertEqual(comb(n, n), 1)
1993 self.assertEqual(comb(n, n-1), n)
1994 self.assertEqual(comb(n, n-2), n * (n-1) // 2)
Serhiy Storchaka1b8a46d2019-06-17 16:58:32 +03001995 if support.check_impl_detail(cpython=True):
1996 self.assertRaises(OverflowError, comb, n, n//2)
Yash Aggarwal4a686502019-06-01 12:51:27 +05301997
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001998 for n, k in (True, True), (True, False), (False, False):
1999 self.assertEqual(comb(n, k), 1)
2000 self.assertIs(type(comb(n, k)), int)
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03002001 self.assertEqual(comb(IntSubclass(5), IntSubclass(2)), 10)
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03002002 self.assertEqual(comb(MyIndexable(5), MyIndexable(2)), 10)
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03002003 for k in range(3):
2004 self.assertIs(type(comb(IntSubclass(5), IntSubclass(k))), int)
2005 self.assertIs(type(comb(MyIndexable(5), MyIndexable(k))), int)
Yash Aggarwal4a686502019-06-01 12:51:27 +05302006
Pablo Galindo42079072019-02-10 19:56:58 +00002007
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008def test_main():
Christian Heimes53876d92008-04-19 00:31:39 +00002009 from doctest import DocFileSuite
2010 suite = unittest.TestSuite()
2011 suite.addTest(unittest.makeSuite(MathTests))
Tal Einatd5519ed2015-05-31 22:05:00 +03002012 suite.addTest(unittest.makeSuite(IsCloseTests))
Christian Heimes53876d92008-04-19 00:31:39 +00002013 suite.addTest(DocFileSuite("ieee754.txt"))
2014 run_unittest(suite)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002015
2016if __name__ == '__main__':
2017 test_main()