blob: 4a1ba830c98d6428367b858c1f35638a26e76c1e [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 Stinner466e18e2019-07-01 19:01:52 +020015
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)
504 self.assertEqual(math.factorial(0.0), 1)
505 total = 1
506 for i in range(1, 1000):
507 total *= i
508 self.assertEqual(math.factorial(i), total)
509 self.assertEqual(math.factorial(float(i)), total)
510 self.assertEqual(math.factorial(i), py_factorial(i))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000511 self.assertRaises(ValueError, math.factorial, -1)
Mark Dickinson4c8a9a22010-05-15 17:02:38 +0000512 self.assertRaises(ValueError, math.factorial, -1.0)
Mark Dickinson5990d282014-04-10 09:29:39 -0400513 self.assertRaises(ValueError, math.factorial, -10**100)
514 self.assertRaises(ValueError, math.factorial, -1e100)
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000515 self.assertRaises(ValueError, math.factorial, math.pi)
Mark Dickinson5990d282014-04-10 09:29:39 -0400516
Pablo Galindoe9ba3702018-09-03 22:20:06 +0100517 def testFactorialNonIntegers(self):
518 self.assertRaises(TypeError, math.factorial, decimal.Decimal(5.2))
519 self.assertRaises(TypeError, math.factorial, "5")
520
Mark Dickinson5990d282014-04-10 09:29:39 -0400521 # Other implementations may place different upper bounds.
522 @support.cpython_only
523 def testFactorialHugeInputs(self):
Serhiy Storchaka914d6b72019-06-23 17:50:04 +0300524 # Currently raises OverflowError for inputs that are too large
Mark Dickinson5990d282014-04-10 09:29:39 -0400525 # to fit into a C long.
526 self.assertRaises(OverflowError, math.factorial, 10**100)
527 self.assertRaises(OverflowError, math.factorial, 1e100)
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000528
Thomas Wouters89f507f2006-12-13 04:49:30 +0000529 def testFloor(self):
530 self.assertRaises(TypeError, math.floor)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000531 self.assertEqual(int, type(math.floor(0.5)))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000532 self.ftest('floor(0.5)', math.floor(0.5), 0)
533 self.ftest('floor(1.0)', math.floor(1.0), 1)
534 self.ftest('floor(1.5)', math.floor(1.5), 1)
535 self.ftest('floor(-0.5)', math.floor(-0.5), -1)
536 self.ftest('floor(-1.0)', math.floor(-1.0), -1)
537 self.ftest('floor(-1.5)', math.floor(-1.5), -2)
Guido van Rossum806c2462007-08-06 23:33:07 +0000538 # pow() relies on floor() to check for integers
539 # This fails on some platforms - so check it here
540 self.ftest('floor(1.23e167)', math.floor(1.23e167), 1.23e167)
541 self.ftest('floor(-1.23e167)', math.floor(-1.23e167), -1.23e167)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000542 #self.assertEqual(math.ceil(INF), INF)
543 #self.assertEqual(math.ceil(NINF), NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000544 #self.assertTrue(math.isnan(math.floor(NAN)))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000545
Guido van Rossum13e05de2007-08-23 22:56:55 +0000546 class TestFloor:
547 def __floor__(self):
548 return 42
549 class TestNoFloor:
550 pass
551 self.ftest('floor(TestFloor())', math.floor(TestFloor()), 42)
552 self.assertRaises(TypeError, math.floor, TestNoFloor())
553
554 t = TestNoFloor()
555 t.__floor__ = lambda *args: args
556 self.assertRaises(TypeError, math.floor, t)
557 self.assertRaises(TypeError, math.floor, t, 0)
558
Thomas Wouters89f507f2006-12-13 04:49:30 +0000559 def testFmod(self):
560 self.assertRaises(TypeError, math.fmod)
Mark Dickinson5bc7a442011-05-03 21:13:40 +0100561 self.ftest('fmod(10, 1)', math.fmod(10, 1), 0.0)
562 self.ftest('fmod(10, 0.5)', math.fmod(10, 0.5), 0.0)
563 self.ftest('fmod(10, 1.5)', math.fmod(10, 1.5), 1.0)
564 self.ftest('fmod(-10, 1)', math.fmod(-10, 1), -0.0)
565 self.ftest('fmod(-10, 0.5)', math.fmod(-10, 0.5), -0.0)
566 self.ftest('fmod(-10, 1.5)', math.fmod(-10, 1.5), -1.0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000567 self.assertTrue(math.isnan(math.fmod(NAN, 1.)))
568 self.assertTrue(math.isnan(math.fmod(1., NAN)))
569 self.assertTrue(math.isnan(math.fmod(NAN, NAN)))
Christian Heimes53876d92008-04-19 00:31:39 +0000570 self.assertRaises(ValueError, math.fmod, 1., 0.)
571 self.assertRaises(ValueError, math.fmod, INF, 1.)
572 self.assertRaises(ValueError, math.fmod, NINF, 1.)
573 self.assertRaises(ValueError, math.fmod, INF, 0.)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000574 self.assertEqual(math.fmod(3.0, INF), 3.0)
575 self.assertEqual(math.fmod(-3.0, INF), -3.0)
576 self.assertEqual(math.fmod(3.0, NINF), 3.0)
577 self.assertEqual(math.fmod(-3.0, NINF), -3.0)
578 self.assertEqual(math.fmod(0.0, 3.0), 0.0)
579 self.assertEqual(math.fmod(0.0, NINF), 0.0)
Guido van Rossumfcce6301996-08-08 18:26:25 +0000580
Thomas Wouters89f507f2006-12-13 04:49:30 +0000581 def testFrexp(self):
582 self.assertRaises(TypeError, math.frexp)
Guido van Rossumfcce6301996-08-08 18:26:25 +0000583
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000584 def testfrexp(name, result, expected):
585 (mant, exp), (emant, eexp) = result, expected
Thomas Wouters89f507f2006-12-13 04:49:30 +0000586 if abs(mant-emant) > eps or exp != eexp:
587 self.fail('%s returned %r, expected %r'%\
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000588 (name, result, expected))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000589
Thomas Wouters89f507f2006-12-13 04:49:30 +0000590 testfrexp('frexp(-1)', math.frexp(-1), (-0.5, 1))
591 testfrexp('frexp(0)', math.frexp(0), (0, 0))
592 testfrexp('frexp(1)', math.frexp(1), (0.5, 1))
593 testfrexp('frexp(2)', math.frexp(2), (0.5, 2))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000594
Ezio Melottib3aedd42010-11-20 19:04:17 +0000595 self.assertEqual(math.frexp(INF)[0], INF)
596 self.assertEqual(math.frexp(NINF)[0], NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000597 self.assertTrue(math.isnan(math.frexp(NAN)[0]))
Christian Heimes53876d92008-04-19 00:31:39 +0000598
Mark Dickinson63566232009-09-18 21:04:19 +0000599 @requires_IEEE_754
Mark Dickinson5c567082009-04-24 16:39:07 +0000600 @unittest.skipIf(HAVE_DOUBLE_ROUNDING,
601 "fsum is not exact on machines with double rounding")
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000602 def testFsum(self):
603 # math.fsum relies on exact rounding for correct operation.
604 # There's a known problem with IA32 floating-point that causes
605 # inexact rounding in some situations, and will cause the
606 # math.fsum tests below to fail; see issue #2937. On non IEEE
607 # 754 platforms, and on IEEE 754 platforms that exhibit the
608 # problem described in issue #2937, we simply skip the whole
609 # test.
610
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000611 # Python version of math.fsum, for comparison. Uses a
612 # different algorithm based on frexp, ldexp and integer
613 # arithmetic.
614 from sys import float_info
615 mant_dig = float_info.mant_dig
616 etiny = float_info.min_exp - mant_dig
617
618 def msum(iterable):
619 """Full precision summation. Compute sum(iterable) without any
620 intermediate accumulation of error. Based on the 'lsum' function
621 at http://code.activestate.com/recipes/393090/
622
623 """
624 tmant, texp = 0, 0
625 for x in iterable:
626 mant, exp = math.frexp(x)
627 mant, exp = int(math.ldexp(mant, mant_dig)), exp - mant_dig
628 if texp > exp:
629 tmant <<= texp-exp
630 texp = exp
631 else:
632 mant <<= exp-texp
633 tmant += mant
634 # Round tmant * 2**texp to a float. The original recipe
635 # used float(str(tmant)) * 2.0**texp for this, but that's
636 # a little unsafe because str -> float conversion can't be
637 # relied upon to do correct rounding on all platforms.
638 tail = max(len(bin(abs(tmant)))-2 - mant_dig, etiny - texp)
639 if tail > 0:
640 h = 1 << (tail-1)
641 tmant = tmant // (2*h) + bool(tmant & h and tmant & 3*h-1)
642 texp += tail
643 return math.ldexp(tmant, texp)
644
645 test_values = [
646 ([], 0.0),
647 ([0.0], 0.0),
648 ([1e100, 1.0, -1e100, 1e-100, 1e50, -1.0, -1e50], 1e-100),
649 ([2.0**53, -0.5, -2.0**-54], 2.0**53-1.0),
650 ([2.0**53, 1.0, 2.0**-100], 2.0**53+2.0),
651 ([2.0**53+10.0, 1.0, 2.0**-100], 2.0**53+12.0),
652 ([2.0**53-4.0, 0.5, 2.0**-54], 2.0**53-3.0),
653 ([1./n for n in range(1, 1001)],
654 float.fromhex('0x1.df11f45f4e61ap+2')),
655 ([(-1.)**n/n for n in range(1, 1001)],
656 float.fromhex('-0x1.62a2af1bd3624p-1')),
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000657 ([1e16, 1., 1e-16], 10000000000000002.0),
658 ([1e16-2., 1.-2.**-53, -(1e16-2.), -(1.-2.**-53)], 0.0),
659 # exercise code for resizing partials array
660 ([2.**n - 2.**(n+50) + 2.**(n+52) for n in range(-1074, 972, 2)] +
661 [-2.**1022],
662 float.fromhex('0x1.5555555555555p+970')),
663 ]
664
Miss Islington (bot)3c5feaf2019-12-09 09:32:34 -0800665 # Telescoping sum, with exact differences (due to Sterbenz)
666 terms = [1.7**i for i in range(1001)]
667 test_values.append((
668 [terms[i+1] - terms[i] for i in range(1000)] + [-terms[1000]],
669 -terms[0]
670 ))
671
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000672 for i, (vals, expected) in enumerate(test_values):
673 try:
674 actual = math.fsum(vals)
675 except OverflowError:
676 self.fail("test %d failed: got OverflowError, expected %r "
677 "for math.fsum(%.100r)" % (i, expected, vals))
678 except ValueError:
679 self.fail("test %d failed: got ValueError, expected %r "
680 "for math.fsum(%.100r)" % (i, expected, vals))
681 self.assertEqual(actual, expected)
682
683 from random import random, gauss, shuffle
684 for j in range(1000):
685 vals = [7, 1e100, -7, -1e100, -9e-20, 8e-20] * 10
686 s = 0
687 for i in range(200):
688 v = gauss(0, random()) ** 7 - s
689 s += v
690 vals.append(v)
691 shuffle(vals)
692
693 s = msum(vals)
694 self.assertEqual(msum(vals), math.fsum(vals))
695
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +0300696 def testGcd(self):
697 gcd = math.gcd
698 self.assertEqual(gcd(0, 0), 0)
699 self.assertEqual(gcd(1, 0), 1)
700 self.assertEqual(gcd(-1, 0), 1)
701 self.assertEqual(gcd(0, 1), 1)
702 self.assertEqual(gcd(0, -1), 1)
703 self.assertEqual(gcd(7, 1), 1)
704 self.assertEqual(gcd(7, -1), 1)
705 self.assertEqual(gcd(-23, 15), 1)
706 self.assertEqual(gcd(120, 84), 12)
707 self.assertEqual(gcd(84, -120), 12)
708 self.assertEqual(gcd(1216342683557601535506311712,
709 436522681849110124616458784), 32)
710 c = 652560
711 x = 434610456570399902378880679233098819019853229470286994367836600566
712 y = 1064502245825115327754847244914921553977
713 a = x * c
714 b = y * c
715 self.assertEqual(gcd(a, b), c)
716 self.assertEqual(gcd(b, a), c)
717 self.assertEqual(gcd(-a, b), c)
718 self.assertEqual(gcd(b, -a), c)
719 self.assertEqual(gcd(a, -b), c)
720 self.assertEqual(gcd(-b, a), c)
721 self.assertEqual(gcd(-a, -b), c)
722 self.assertEqual(gcd(-b, -a), c)
723 c = 576559230871654959816130551884856912003141446781646602790216406874
724 a = x * c
725 b = y * c
726 self.assertEqual(gcd(a, b), c)
727 self.assertEqual(gcd(b, a), c)
728 self.assertEqual(gcd(-a, b), c)
729 self.assertEqual(gcd(b, -a), c)
730 self.assertEqual(gcd(a, -b), c)
731 self.assertEqual(gcd(-b, a), c)
732 self.assertEqual(gcd(-a, -b), c)
733 self.assertEqual(gcd(-b, -a), c)
734
735 self.assertRaises(TypeError, gcd, 120.0, 84)
736 self.assertRaises(TypeError, gcd, 120, 84.0)
737 self.assertEqual(gcd(MyIndexable(120), MyIndexable(84)), 12)
738
Thomas Wouters89f507f2006-12-13 04:49:30 +0000739 def testHypot(self):
Raymond Hettingerc6dabe32018-07-28 07:48:04 -0700740 from decimal import Decimal
741 from fractions import Fraction
742
743 hypot = math.hypot
744
745 # Test different numbers of arguments (from zero to five)
746 # against a straightforward pure python implementation
747 args = math.e, math.pi, math.sqrt(2.0), math.gamma(3.5), math.sin(2.1)
748 for i in range(len(args)+1):
749 self.assertAlmostEqual(
750 hypot(*args[:i]),
751 math.sqrt(sum(s**2 for s in args[:i]))
752 )
753
754 # Test allowable types (those with __float__)
755 self.assertEqual(hypot(12.0, 5.0), 13.0)
756 self.assertEqual(hypot(12, 5), 13)
757 self.assertEqual(hypot(Decimal(12), Decimal(5)), 13)
758 self.assertEqual(hypot(Fraction(12, 32), Fraction(5, 32)), Fraction(13, 32))
759 self.assertEqual(hypot(bool(1), bool(0), bool(1), bool(1)), math.sqrt(3))
760
761 # Test corner cases
762 self.assertEqual(hypot(0.0, 0.0), 0.0) # Max input is zero
763 self.assertEqual(hypot(-10.5), 10.5) # Negative input
764 self.assertEqual(hypot(), 0.0) # Negative input
765 self.assertEqual(1.0,
766 math.copysign(1.0, hypot(-0.0)) # Convert negative zero to positive zero
767 )
Raymond Hettinger00414592018-08-12 12:15:23 -0700768 self.assertEqual( # Handling of moving max to the end
769 hypot(1.5, 1.5, 0.5),
770 hypot(1.5, 0.5, 1.5),
771 )
Raymond Hettingerc6dabe32018-07-28 07:48:04 -0700772
773 # Test handling of bad arguments
774 with self.assertRaises(TypeError): # Reject keyword args
775 hypot(x=1)
776 with self.assertRaises(TypeError): # Reject values without __float__
777 hypot(1.1, 'string', 2.2)
Raymond Hettinger808180c2019-01-28 13:59:56 -0800778 int_too_big_for_float = 10 ** (sys.float_info.max_10_exp + 5)
779 with self.assertRaises((ValueError, OverflowError)):
780 hypot(1, int_too_big_for_float)
Raymond Hettingerc6dabe32018-07-28 07:48:04 -0700781
782 # Any infinity gives positive infinity.
783 self.assertEqual(hypot(INF), INF)
784 self.assertEqual(hypot(0, INF), INF)
785 self.assertEqual(hypot(10, INF), INF)
786 self.assertEqual(hypot(-10, INF), INF)
787 self.assertEqual(hypot(NAN, INF), INF)
788 self.assertEqual(hypot(INF, NAN), INF)
789 self.assertEqual(hypot(NINF, NAN), INF)
790 self.assertEqual(hypot(NAN, NINF), INF)
791 self.assertEqual(hypot(-INF, INF), INF)
792 self.assertEqual(hypot(-INF, -INF), INF)
793 self.assertEqual(hypot(10, -INF), INF)
794
Raymond Hettinger00414592018-08-12 12:15:23 -0700795 # If no infinity, any NaN gives a NaN.
Raymond Hettingerc6dabe32018-07-28 07:48:04 -0700796 self.assertTrue(math.isnan(hypot(NAN)))
797 self.assertTrue(math.isnan(hypot(0, NAN)))
798 self.assertTrue(math.isnan(hypot(NAN, 10)))
799 self.assertTrue(math.isnan(hypot(10, NAN)))
800 self.assertTrue(math.isnan(hypot(NAN, NAN)))
801 self.assertTrue(math.isnan(hypot(NAN)))
802
803 # Verify scaling for extremely large values
804 fourthmax = FLOAT_MAX / 4.0
805 for n in range(32):
806 self.assertEqual(hypot(*([fourthmax]*n)), fourthmax * math.sqrt(n))
807
808 # Verify scaling for extremely small values
809 for exp in range(32):
810 scale = FLOAT_MIN / 2.0 ** exp
811 self.assertEqual(math.hypot(4*scale, 3*scale), 5*scale)
Guido van Rossumfcce6301996-08-08 18:26:25 +0000812
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700813 def testDist(self):
814 from decimal import Decimal as D
815 from fractions import Fraction as F
816
817 dist = math.dist
818 sqrt = math.sqrt
819
Raymond Hettinger808180c2019-01-28 13:59:56 -0800820 # Simple exact cases
821 self.assertEqual(dist((1.0, 2.0, 3.0), (4.0, 2.0, -1.0)), 5.0)
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700822 self.assertEqual(dist((1, 2, 3), (4, 2, -1)), 5.0)
823
824 # Test different numbers of arguments (from zero to nine)
825 # against a straightforward pure python implementation
826 for i in range(9):
827 for j in range(5):
828 p = tuple(random.uniform(-5, 5) for k in range(i))
829 q = tuple(random.uniform(-5, 5) for k in range(i))
830 self.assertAlmostEqual(
831 dist(p, q),
832 sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
833 )
834
Miss Islington (bot)76821ba2019-07-27 14:26:58 -0700835 # Test non-tuple inputs
836 self.assertEqual(dist([1.0, 2.0, 3.0], [4.0, 2.0, -1.0]), 5.0)
837 self.assertEqual(dist(iter([1.0, 2.0, 3.0]), iter([4.0, 2.0, -1.0])), 5.0)
838
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700839 # Test allowable types (those with __float__)
840 self.assertEqual(dist((14.0, 1.0), (2.0, -4.0)), 13.0)
841 self.assertEqual(dist((14, 1), (2, -4)), 13)
842 self.assertEqual(dist((D(14), D(1)), (D(2), D(-4))), D(13))
843 self.assertEqual(dist((F(14, 32), F(1, 32)), (F(2, 32), F(-4, 32))),
844 F(13, 32))
845 self.assertEqual(dist((True, True, False, True, False),
846 (True, False, True, True, False)),
847 sqrt(2.0))
848
849 # Test corner cases
850 self.assertEqual(dist((13.25, 12.5, -3.25),
851 (13.25, 12.5, -3.25)),
852 0.0) # Distance with self is zero
853 self.assertEqual(dist((), ()), 0.0) # Zero-dimensional case
854 self.assertEqual(1.0, # Convert negative zero to positive zero
855 math.copysign(1.0, dist((-0.0,), (0.0,)))
856 )
857 self.assertEqual(1.0, # Convert negative zero to positive zero
858 math.copysign(1.0, dist((0.0,), (-0.0,)))
859 )
Raymond Hettinger00414592018-08-12 12:15:23 -0700860 self.assertEqual( # Handling of moving max to the end
861 dist((1.5, 1.5, 0.5), (0, 0, 0)),
862 dist((1.5, 0.5, 1.5), (0, 0, 0))
863 )
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700864
865 # Verify tuple subclasses are allowed
Raymond Hettinger00414592018-08-12 12:15:23 -0700866 class T(tuple):
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700867 pass
868 self.assertEqual(dist(T((1, 2, 3)), ((4, 2, -1))), 5.0)
869
870 # Test handling of bad arguments
871 with self.assertRaises(TypeError): # Reject keyword args
872 dist(p=(1, 2, 3), q=(4, 5, 6))
873 with self.assertRaises(TypeError): # Too few args
874 dist((1, 2, 3))
875 with self.assertRaises(TypeError): # Too many args
876 dist((1, 2, 3), (4, 5, 6), (7, 8, 9))
877 with self.assertRaises(TypeError): # Scalars not allowed
878 dist(1, 2)
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700879 with self.assertRaises(TypeError): # Reject values without __float__
880 dist((1.1, 'string', 2.2), (1, 2, 3))
881 with self.assertRaises(ValueError): # Check dimension agree
882 dist((1, 2, 3, 4), (5, 6, 7))
883 with self.assertRaises(ValueError): # Check dimension agree
884 dist((1, 2, 3), (4, 5, 6, 7))
Ammar Askarcb08a712019-01-12 01:23:41 -0500885 with self.assertRaises(TypeError): # Rejects invalid types
886 dist("abc", "xyz")
Raymond Hettinger808180c2019-01-28 13:59:56 -0800887 int_too_big_for_float = 10 ** (sys.float_info.max_10_exp + 5)
888 with self.assertRaises((ValueError, OverflowError)):
889 dist((1, int_too_big_for_float), (2, 3))
890 with self.assertRaises((ValueError, OverflowError)):
891 dist((2, 3), (1, int_too_big_for_float))
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700892
Raymond Hettinger00414592018-08-12 12:15:23 -0700893 # Verify that the one dimensional case is equivalent to abs()
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700894 for i in range(20):
895 p, q = random.random(), random.random()
896 self.assertEqual(dist((p,), (q,)), abs(p - q))
897
898 # Test special values
899 values = [NINF, -10.5, -0.0, 0.0, 10.5, INF, NAN]
900 for p in itertools.product(values, repeat=3):
901 for q in itertools.product(values, repeat=3):
902 diffs = [px - qx for px, qx in zip(p, q)]
903 if any(map(math.isinf, diffs)):
904 # Any infinite difference gives positive infinity.
905 self.assertEqual(dist(p, q), INF)
906 elif any(map(math.isnan, diffs)):
Raymond Hettinger00414592018-08-12 12:15:23 -0700907 # If no infinity, any NaN gives a NaN.
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700908 self.assertTrue(math.isnan(dist(p, q)))
909
910 # Verify scaling for extremely large values
911 fourthmax = FLOAT_MAX / 4.0
912 for n in range(32):
913 p = (fourthmax,) * n
914 q = (0.0,) * n
915 self.assertEqual(dist(p, q), fourthmax * math.sqrt(n))
916 self.assertEqual(dist(q, p), fourthmax * math.sqrt(n))
917
918 # Verify scaling for extremely small values
919 for exp in range(32):
920 scale = FLOAT_MIN / 2.0 ** exp
921 p = (4*scale, 3*scale)
922 q = (0.0, 0.0)
923 self.assertEqual(math.dist(p, q), 5*scale)
924 self.assertEqual(math.dist(q, p), 5*scale)
925
Mark Dickinson73934b92019-05-18 12:29:50 +0100926 def testIsqrt(self):
927 # Test a variety of inputs, large and small.
928 test_values = (
929 list(range(1000))
930 + list(range(10**6 - 1000, 10**6 + 1000))
Mark Dickinson5c08ce92019-05-19 17:51:56 +0100931 + [2**e + i for e in range(60, 200) for i in range(-40, 40)]
Mark Dickinson73934b92019-05-18 12:29:50 +0100932 + [3**9999, 10**5001]
933 )
934
935 for value in test_values:
936 with self.subTest(value=value):
937 s = math.isqrt(value)
938 self.assertIs(type(s), int)
939 self.assertLessEqual(s*s, value)
940 self.assertLess(value, (s+1)*(s+1))
941
942 # Negative values
943 with self.assertRaises(ValueError):
944 math.isqrt(-1)
945
946 # Integer-like things
947 s = math.isqrt(True)
948 self.assertIs(type(s), int)
949 self.assertEqual(s, 1)
950
951 s = math.isqrt(False)
952 self.assertIs(type(s), int)
953 self.assertEqual(s, 0)
954
955 class IntegerLike(object):
956 def __init__(self, value):
957 self.value = value
958
959 def __index__(self):
960 return self.value
961
962 s = math.isqrt(IntegerLike(1729))
963 self.assertIs(type(s), int)
964 self.assertEqual(s, 41)
965
966 with self.assertRaises(ValueError):
967 math.isqrt(IntegerLike(-3))
968
969 # Non-integer-like things
970 bad_values = [
971 3.5, "a string", decimal.Decimal("3.5"), 3.5j,
972 100.0, -4.0,
973 ]
974 for value in bad_values:
975 with self.subTest(value=value):
976 with self.assertRaises(TypeError):
977 math.isqrt(value)
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -0700978
Thomas Wouters89f507f2006-12-13 04:49:30 +0000979 def testLdexp(self):
980 self.assertRaises(TypeError, math.ldexp)
981 self.ftest('ldexp(0,1)', math.ldexp(0,1), 0)
982 self.ftest('ldexp(1,1)', math.ldexp(1,1), 2)
983 self.ftest('ldexp(1,-1)', math.ldexp(1,-1), 0.5)
984 self.ftest('ldexp(-1,1)', math.ldexp(-1,1), -2)
Christian Heimes53876d92008-04-19 00:31:39 +0000985 self.assertRaises(OverflowError, math.ldexp, 1., 1000000)
986 self.assertRaises(OverflowError, math.ldexp, -1., 1000000)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000987 self.assertEqual(math.ldexp(1., -1000000), 0.)
988 self.assertEqual(math.ldexp(-1., -1000000), -0.)
989 self.assertEqual(math.ldexp(INF, 30), INF)
990 self.assertEqual(math.ldexp(NINF, -213), NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000991 self.assertTrue(math.isnan(math.ldexp(NAN, 0)))
Guido van Rossumfcce6301996-08-08 18:26:25 +0000992
Alexandre Vassalotti6461e102008-05-15 22:09:29 +0000993 # large second argument
994 for n in [10**5, 10**10, 10**20, 10**40]:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000995 self.assertEqual(math.ldexp(INF, -n), INF)
996 self.assertEqual(math.ldexp(NINF, -n), NINF)
997 self.assertEqual(math.ldexp(1., -n), 0.)
998 self.assertEqual(math.ldexp(-1., -n), -0.)
999 self.assertEqual(math.ldexp(0., -n), 0.)
1000 self.assertEqual(math.ldexp(-0., -n), -0.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001001 self.assertTrue(math.isnan(math.ldexp(NAN, -n)))
Alexandre Vassalotti6461e102008-05-15 22:09:29 +00001002
1003 self.assertRaises(OverflowError, math.ldexp, 1., n)
1004 self.assertRaises(OverflowError, math.ldexp, -1., n)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001005 self.assertEqual(math.ldexp(0., n), 0.)
1006 self.assertEqual(math.ldexp(-0., n), -0.)
1007 self.assertEqual(math.ldexp(INF, n), INF)
1008 self.assertEqual(math.ldexp(NINF, n), NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001009 self.assertTrue(math.isnan(math.ldexp(NAN, n)))
Alexandre Vassalotti6461e102008-05-15 22:09:29 +00001010
Thomas Wouters89f507f2006-12-13 04:49:30 +00001011 def testLog(self):
1012 self.assertRaises(TypeError, math.log)
1013 self.ftest('log(1/e)', math.log(1/math.e), -1)
1014 self.ftest('log(1)', math.log(1), 0)
1015 self.ftest('log(e)', math.log(math.e), 1)
1016 self.ftest('log(32,2)', math.log(32,2), 5)
1017 self.ftest('log(10**40, 10)', math.log(10**40, 10), 40)
1018 self.ftest('log(10**40, 10**20)', math.log(10**40, 10**20), 2)
Mark Dickinsonc6037172010-09-29 19:06:36 +00001019 self.ftest('log(10**1000)', math.log(10**1000),
1020 2302.5850929940457)
1021 self.assertRaises(ValueError, math.log, -1.5)
1022 self.assertRaises(ValueError, math.log, -10**1000)
Christian Heimes53876d92008-04-19 00:31:39 +00001023 self.assertRaises(ValueError, math.log, NINF)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001024 self.assertEqual(math.log(INF), INF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001025 self.assertTrue(math.isnan(math.log(NAN)))
Christian Heimes53876d92008-04-19 00:31:39 +00001026
1027 def testLog1p(self):
1028 self.assertRaises(TypeError, math.log1p)
Mark Dickinson31ba1c32016-09-04 12:29:14 +01001029 for n in [2, 2**90, 2**300]:
1030 self.assertAlmostEqual(math.log1p(n), math.log1p(float(n)))
1031 self.assertRaises(ValueError, math.log1p, -1)
1032 self.assertEqual(math.log1p(INF), INF)
Guido van Rossumfcce6301996-08-08 18:26:25 +00001033
Victor Stinnerfa0e3d52011-05-09 01:01:09 +02001034 @requires_IEEE_754
1035 def testLog2(self):
1036 self.assertRaises(TypeError, math.log2)
Victor Stinnerfa0e3d52011-05-09 01:01:09 +02001037
1038 # Check some integer values
1039 self.assertEqual(math.log2(1), 0.0)
1040 self.assertEqual(math.log2(2), 1.0)
1041 self.assertEqual(math.log2(4), 2.0)
1042
1043 # Large integer values
1044 self.assertEqual(math.log2(2**1023), 1023.0)
1045 self.assertEqual(math.log2(2**1024), 1024.0)
1046 self.assertEqual(math.log2(2**2000), 2000.0)
1047
1048 self.assertRaises(ValueError, math.log2, -1.5)
1049 self.assertRaises(ValueError, math.log2, NINF)
1050 self.assertTrue(math.isnan(math.log2(NAN)))
1051
Victor Stinnercd9dd372011-05-10 23:40:17 +02001052 @requires_IEEE_754
Victor Stinnerebbbdaf2011-06-01 13:19:07 +02001053 # log2() is not accurate enough on Mac OS X Tiger (10.4)
1054 @support.requires_mac_ver(10, 5)
Victor Stinnercd9dd372011-05-10 23:40:17 +02001055 def testLog2Exact(self):
1056 # Check that we get exact equality for log2 of powers of 2.
1057 actual = [math.log2(math.ldexp(1.0, n)) for n in range(-1074, 1024)]
1058 expected = [float(n) for n in range(-1074, 1024)]
1059 self.assertEqual(actual, expected)
1060
Thomas Wouters89f507f2006-12-13 04:49:30 +00001061 def testLog10(self):
1062 self.assertRaises(TypeError, math.log10)
1063 self.ftest('log10(0.1)', math.log10(0.1), -1)
1064 self.ftest('log10(1)', math.log10(1), 0)
1065 self.ftest('log10(10)', math.log10(10), 1)
Mark Dickinsonc6037172010-09-29 19:06:36 +00001066 self.ftest('log10(10**1000)', math.log10(10**1000), 1000.0)
1067 self.assertRaises(ValueError, math.log10, -1.5)
1068 self.assertRaises(ValueError, math.log10, -10**1000)
Christian Heimes53876d92008-04-19 00:31:39 +00001069 self.assertRaises(ValueError, math.log10, NINF)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001070 self.assertEqual(math.log(INF), INF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001071 self.assertTrue(math.isnan(math.log10(NAN)))
Guido van Rossumfcce6301996-08-08 18:26:25 +00001072
Thomas Wouters89f507f2006-12-13 04:49:30 +00001073 def testModf(self):
1074 self.assertRaises(TypeError, math.modf)
Guido van Rossumfcce6301996-08-08 18:26:25 +00001075
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001076 def testmodf(name, result, expected):
1077 (v1, v2), (e1, e2) = result, expected
Thomas Wouters89f507f2006-12-13 04:49:30 +00001078 if abs(v1-e1) > eps or abs(v2-e2):
1079 self.fail('%s returned %r, expected %r'%\
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001080 (name, result, expected))
Raymond Hettinger64108af2002-05-13 03:55:01 +00001081
Thomas Wouters89f507f2006-12-13 04:49:30 +00001082 testmodf('modf(1.5)', math.modf(1.5), (0.5, 1.0))
1083 testmodf('modf(-1.5)', math.modf(-1.5), (-0.5, -1.0))
Guido van Rossumfcce6301996-08-08 18:26:25 +00001084
Ezio Melottib3aedd42010-11-20 19:04:17 +00001085 self.assertEqual(math.modf(INF), (0.0, INF))
1086 self.assertEqual(math.modf(NINF), (-0.0, NINF))
Christian Heimes53876d92008-04-19 00:31:39 +00001087
1088 modf_nan = math.modf(NAN)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001089 self.assertTrue(math.isnan(modf_nan[0]))
1090 self.assertTrue(math.isnan(modf_nan[1]))
Christian Heimes53876d92008-04-19 00:31:39 +00001091
Thomas Wouters89f507f2006-12-13 04:49:30 +00001092 def testPow(self):
1093 self.assertRaises(TypeError, math.pow)
1094 self.ftest('pow(0,1)', math.pow(0,1), 0)
1095 self.ftest('pow(1,0)', math.pow(1,0), 1)
1096 self.ftest('pow(2,1)', math.pow(2,1), 2)
1097 self.ftest('pow(2,-1)', math.pow(2,-1), 0.5)
Christian Heimes53876d92008-04-19 00:31:39 +00001098 self.assertEqual(math.pow(INF, 1), INF)
1099 self.assertEqual(math.pow(NINF, 1), NINF)
1100 self.assertEqual((math.pow(1, INF)), 1.)
1101 self.assertEqual((math.pow(1, NINF)), 1.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001102 self.assertTrue(math.isnan(math.pow(NAN, 1)))
1103 self.assertTrue(math.isnan(math.pow(2, NAN)))
1104 self.assertTrue(math.isnan(math.pow(0, NAN)))
Christian Heimes53876d92008-04-19 00:31:39 +00001105 self.assertEqual(math.pow(1, NAN), 1)
Christian Heimesa342c012008-04-20 21:01:16 +00001106
1107 # pow(0., x)
1108 self.assertEqual(math.pow(0., INF), 0.)
1109 self.assertEqual(math.pow(0., 3.), 0.)
1110 self.assertEqual(math.pow(0., 2.3), 0.)
1111 self.assertEqual(math.pow(0., 2.), 0.)
1112 self.assertEqual(math.pow(0., 0.), 1.)
1113 self.assertEqual(math.pow(0., -0.), 1.)
1114 self.assertRaises(ValueError, math.pow, 0., -2.)
1115 self.assertRaises(ValueError, math.pow, 0., -2.3)
1116 self.assertRaises(ValueError, math.pow, 0., -3.)
1117 self.assertRaises(ValueError, math.pow, 0., NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001118 self.assertTrue(math.isnan(math.pow(0., NAN)))
Christian Heimesa342c012008-04-20 21:01:16 +00001119
1120 # pow(INF, x)
1121 self.assertEqual(math.pow(INF, INF), INF)
1122 self.assertEqual(math.pow(INF, 3.), INF)
1123 self.assertEqual(math.pow(INF, 2.3), INF)
1124 self.assertEqual(math.pow(INF, 2.), INF)
1125 self.assertEqual(math.pow(INF, 0.), 1.)
1126 self.assertEqual(math.pow(INF, -0.), 1.)
1127 self.assertEqual(math.pow(INF, -2.), 0.)
1128 self.assertEqual(math.pow(INF, -2.3), 0.)
1129 self.assertEqual(math.pow(INF, -3.), 0.)
1130 self.assertEqual(math.pow(INF, NINF), 0.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001131 self.assertTrue(math.isnan(math.pow(INF, NAN)))
Christian Heimesa342c012008-04-20 21:01:16 +00001132
1133 # pow(-0., x)
1134 self.assertEqual(math.pow(-0., INF), 0.)
1135 self.assertEqual(math.pow(-0., 3.), -0.)
1136 self.assertEqual(math.pow(-0., 2.3), 0.)
1137 self.assertEqual(math.pow(-0., 2.), 0.)
1138 self.assertEqual(math.pow(-0., 0.), 1.)
1139 self.assertEqual(math.pow(-0., -0.), 1.)
1140 self.assertRaises(ValueError, math.pow, -0., -2.)
1141 self.assertRaises(ValueError, math.pow, -0., -2.3)
1142 self.assertRaises(ValueError, math.pow, -0., -3.)
1143 self.assertRaises(ValueError, math.pow, -0., NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001144 self.assertTrue(math.isnan(math.pow(-0., NAN)))
Christian Heimesa342c012008-04-20 21:01:16 +00001145
1146 # pow(NINF, x)
1147 self.assertEqual(math.pow(NINF, INF), INF)
1148 self.assertEqual(math.pow(NINF, 3.), NINF)
1149 self.assertEqual(math.pow(NINF, 2.3), INF)
1150 self.assertEqual(math.pow(NINF, 2.), INF)
1151 self.assertEqual(math.pow(NINF, 0.), 1.)
1152 self.assertEqual(math.pow(NINF, -0.), 1.)
1153 self.assertEqual(math.pow(NINF, -2.), 0.)
1154 self.assertEqual(math.pow(NINF, -2.3), 0.)
1155 self.assertEqual(math.pow(NINF, -3.), -0.)
1156 self.assertEqual(math.pow(NINF, NINF), 0.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001157 self.assertTrue(math.isnan(math.pow(NINF, NAN)))
Christian Heimesa342c012008-04-20 21:01:16 +00001158
1159 # pow(-1, x)
1160 self.assertEqual(math.pow(-1., INF), 1.)
1161 self.assertEqual(math.pow(-1., 3.), -1.)
1162 self.assertRaises(ValueError, math.pow, -1., 2.3)
1163 self.assertEqual(math.pow(-1., 2.), 1.)
1164 self.assertEqual(math.pow(-1., 0.), 1.)
1165 self.assertEqual(math.pow(-1., -0.), 1.)
1166 self.assertEqual(math.pow(-1., -2.), 1.)
1167 self.assertRaises(ValueError, math.pow, -1., -2.3)
1168 self.assertEqual(math.pow(-1., -3.), -1.)
1169 self.assertEqual(math.pow(-1., NINF), 1.)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001170 self.assertTrue(math.isnan(math.pow(-1., NAN)))
Christian Heimesa342c012008-04-20 21:01:16 +00001171
1172 # pow(1, x)
1173 self.assertEqual(math.pow(1., INF), 1.)
1174 self.assertEqual(math.pow(1., 3.), 1.)
1175 self.assertEqual(math.pow(1., 2.3), 1.)
1176 self.assertEqual(math.pow(1., 2.), 1.)
1177 self.assertEqual(math.pow(1., 0.), 1.)
1178 self.assertEqual(math.pow(1., -0.), 1.)
1179 self.assertEqual(math.pow(1., -2.), 1.)
1180 self.assertEqual(math.pow(1., -2.3), 1.)
1181 self.assertEqual(math.pow(1., -3.), 1.)
1182 self.assertEqual(math.pow(1., NINF), 1.)
1183 self.assertEqual(math.pow(1., NAN), 1.)
1184
1185 # pow(x, 0) should be 1 for any x
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 self.assertEqual(math.pow(2.3, -0.), 1.)
1190 self.assertEqual(math.pow(-2.3, -0.), 1.)
1191 self.assertEqual(math.pow(NAN, -0.), 1.)
1192
1193 # pow(x, y) is invalid if x is negative and y is not integral
1194 self.assertRaises(ValueError, math.pow, -1., 2.3)
1195 self.assertRaises(ValueError, math.pow, -15., -3.1)
1196
1197 # pow(x, NINF)
1198 self.assertEqual(math.pow(1.9, NINF), 0.)
1199 self.assertEqual(math.pow(1.1, NINF), 0.)
1200 self.assertEqual(math.pow(0.9, NINF), INF)
1201 self.assertEqual(math.pow(0.1, NINF), INF)
1202 self.assertEqual(math.pow(-0.1, NINF), INF)
1203 self.assertEqual(math.pow(-0.9, NINF), INF)
1204 self.assertEqual(math.pow(-1.1, NINF), 0.)
1205 self.assertEqual(math.pow(-1.9, NINF), 0.)
1206
1207 # pow(x, INF)
1208 self.assertEqual(math.pow(1.9, INF), INF)
1209 self.assertEqual(math.pow(1.1, INF), INF)
1210 self.assertEqual(math.pow(0.9, INF), 0.)
1211 self.assertEqual(math.pow(0.1, INF), 0.)
1212 self.assertEqual(math.pow(-0.1, INF), 0.)
1213 self.assertEqual(math.pow(-0.9, INF), 0.)
1214 self.assertEqual(math.pow(-1.1, INF), INF)
1215 self.assertEqual(math.pow(-1.9, INF), INF)
1216
1217 # pow(x, y) should work for x negative, y an integer
1218 self.ftest('(-2.)**3.', math.pow(-2.0, 3.0), -8.0)
1219 self.ftest('(-2.)**2.', math.pow(-2.0, 2.0), 4.0)
1220 self.ftest('(-2.)**1.', math.pow(-2.0, 1.0), -2.0)
1221 self.ftest('(-2.)**0.', math.pow(-2.0, 0.0), 1.0)
1222 self.ftest('(-2.)**-0.', math.pow(-2.0, -0.0), 1.0)
1223 self.ftest('(-2.)**-1.', math.pow(-2.0, -1.0), -0.5)
1224 self.ftest('(-2.)**-2.', math.pow(-2.0, -2.0), 0.25)
1225 self.ftest('(-2.)**-3.', math.pow(-2.0, -3.0), -0.125)
1226 self.assertRaises(ValueError, math.pow, -2.0, -0.5)
1227 self.assertRaises(ValueError, math.pow, -2.0, 0.5)
1228
1229 # the following tests have been commented out since they don't
1230 # really belong here: the implementation of ** for floats is
Ezio Melotti13925002011-03-16 11:05:33 +02001231 # independent of the implementation of math.pow
Christian Heimesa342c012008-04-20 21:01:16 +00001232 #self.assertEqual(1**NAN, 1)
1233 #self.assertEqual(1**INF, 1)
1234 #self.assertEqual(1**NINF, 1)
1235 #self.assertEqual(1**0, 1)
1236 #self.assertEqual(1.**NAN, 1)
1237 #self.assertEqual(1.**INF, 1)
1238 #self.assertEqual(1.**NINF, 1)
1239 #self.assertEqual(1.**0, 1)
Guido van Rossumfcce6301996-08-08 18:26:25 +00001240
Thomas Wouters89f507f2006-12-13 04:49:30 +00001241 def testRadians(self):
1242 self.assertRaises(TypeError, math.radians)
1243 self.ftest('radians(180)', math.radians(180), math.pi)
1244 self.ftest('radians(90)', math.radians(90), math.pi/2)
1245 self.ftest('radians(-45)', math.radians(-45), -math.pi/4)
Mark Dickinson31ba1c32016-09-04 12:29:14 +01001246 self.ftest('radians(0)', math.radians(0), 0)
Guido van Rossumfcce6301996-08-08 18:26:25 +00001247
Mark Dickinsona0ce3752017-04-05 18:34:27 +01001248 @requires_IEEE_754
1249 def testRemainder(self):
1250 from fractions import Fraction
1251
1252 def validate_spec(x, y, r):
1253 """
1254 Check that r matches remainder(x, y) according to the IEEE 754
1255 specification. Assumes that x, y and r are finite and y is nonzero.
1256 """
1257 fx, fy, fr = Fraction(x), Fraction(y), Fraction(r)
1258 # r should not exceed y/2 in absolute value
1259 self.assertLessEqual(abs(fr), abs(fy/2))
1260 # x - r should be an exact integer multiple of y
1261 n = (fx - fr) / fy
1262 self.assertEqual(n, int(n))
1263 if abs(fr) == abs(fy/2):
1264 # If |r| == |y/2|, n should be even.
1265 self.assertEqual(n/2, int(n/2))
1266
1267 # triples (x, y, remainder(x, y)) in hexadecimal form.
1268 testcases = [
1269 # Remainders modulo 1, showing the ties-to-even behaviour.
1270 '-4.0 1 -0.0',
1271 '-3.8 1 0.8',
1272 '-3.0 1 -0.0',
1273 '-2.8 1 -0.8',
1274 '-2.0 1 -0.0',
1275 '-1.8 1 0.8',
1276 '-1.0 1 -0.0',
1277 '-0.8 1 -0.8',
1278 '-0.0 1 -0.0',
1279 ' 0.0 1 0.0',
1280 ' 0.8 1 0.8',
1281 ' 1.0 1 0.0',
1282 ' 1.8 1 -0.8',
1283 ' 2.0 1 0.0',
1284 ' 2.8 1 0.8',
1285 ' 3.0 1 0.0',
1286 ' 3.8 1 -0.8',
1287 ' 4.0 1 0.0',
1288
1289 # Reductions modulo 2*pi
1290 '0x0.0p+0 0x1.921fb54442d18p+2 0x0.0p+0',
1291 '0x1.921fb54442d18p+0 0x1.921fb54442d18p+2 0x1.921fb54442d18p+0',
1292 '0x1.921fb54442d17p+1 0x1.921fb54442d18p+2 0x1.921fb54442d17p+1',
1293 '0x1.921fb54442d18p+1 0x1.921fb54442d18p+2 0x1.921fb54442d18p+1',
1294 '0x1.921fb54442d19p+1 0x1.921fb54442d18p+2 -0x1.921fb54442d17p+1',
1295 '0x1.921fb54442d17p+2 0x1.921fb54442d18p+2 -0x0.0000000000001p+2',
1296 '0x1.921fb54442d18p+2 0x1.921fb54442d18p+2 0x0p0',
1297 '0x1.921fb54442d19p+2 0x1.921fb54442d18p+2 0x0.0000000000001p+2',
1298 '0x1.2d97c7f3321d1p+3 0x1.921fb54442d18p+2 0x1.921fb54442d14p+1',
1299 '0x1.2d97c7f3321d2p+3 0x1.921fb54442d18p+2 -0x1.921fb54442d18p+1',
1300 '0x1.2d97c7f3321d3p+3 0x1.921fb54442d18p+2 -0x1.921fb54442d14p+1',
1301 '0x1.921fb54442d17p+3 0x1.921fb54442d18p+2 -0x0.0000000000001p+3',
1302 '0x1.921fb54442d18p+3 0x1.921fb54442d18p+2 0x0p0',
1303 '0x1.921fb54442d19p+3 0x1.921fb54442d18p+2 0x0.0000000000001p+3',
1304 '0x1.f6a7a2955385dp+3 0x1.921fb54442d18p+2 0x1.921fb54442d14p+1',
1305 '0x1.f6a7a2955385ep+3 0x1.921fb54442d18p+2 0x1.921fb54442d18p+1',
1306 '0x1.f6a7a2955385fp+3 0x1.921fb54442d18p+2 -0x1.921fb54442d14p+1',
1307 '0x1.1475cc9eedf00p+5 0x1.921fb54442d18p+2 0x1.921fb54442d10p+1',
1308 '0x1.1475cc9eedf01p+5 0x1.921fb54442d18p+2 -0x1.921fb54442d10p+1',
1309
1310 # Symmetry with respect to signs.
1311 ' 1 0.c 0.4',
1312 '-1 0.c -0.4',
1313 ' 1 -0.c 0.4',
1314 '-1 -0.c -0.4',
1315 ' 1.4 0.c -0.4',
1316 '-1.4 0.c 0.4',
1317 ' 1.4 -0.c -0.4',
1318 '-1.4 -0.c 0.4',
1319
1320 # Huge modulus, to check that the underlying algorithm doesn't
1321 # rely on 2.0 * modulus being representable.
1322 '0x1.dp+1023 0x1.4p+1023 0x0.9p+1023',
1323 '0x1.ep+1023 0x1.4p+1023 -0x0.ap+1023',
1324 '0x1.fp+1023 0x1.4p+1023 -0x0.9p+1023',
1325 ]
1326
1327 for case in testcases:
1328 with self.subTest(case=case):
1329 x_hex, y_hex, expected_hex = case.split()
1330 x = float.fromhex(x_hex)
1331 y = float.fromhex(y_hex)
1332 expected = float.fromhex(expected_hex)
1333 validate_spec(x, y, expected)
1334 actual = math.remainder(x, y)
1335 # Cheap way of checking that the floats are
1336 # as identical as we need them to be.
1337 self.assertEqual(actual.hex(), expected.hex())
1338
1339 # Test tiny subnormal modulus: there's potential for
1340 # getting the implementation wrong here (for example,
1341 # by assuming that modulus/2 is exactly representable).
1342 tiny = float.fromhex('1p-1074') # min +ve subnormal
1343 for n in range(-25, 25):
1344 if n == 0:
1345 continue
1346 y = n * tiny
1347 for m in range(100):
1348 x = m * tiny
1349 actual = math.remainder(x, y)
1350 validate_spec(x, y, actual)
1351 actual = math.remainder(-x, y)
1352 validate_spec(-x, y, actual)
1353
1354 # Special values.
1355 # NaNs should propagate as usual.
1356 for value in [NAN, 0.0, -0.0, 2.0, -2.3, NINF, INF]:
1357 self.assertIsNaN(math.remainder(NAN, value))
1358 self.assertIsNaN(math.remainder(value, NAN))
1359
1360 # remainder(x, inf) is x, for non-nan non-infinite x.
1361 for value in [-2.3, -0.0, 0.0, 2.3]:
1362 self.assertEqual(math.remainder(value, INF), value)
1363 self.assertEqual(math.remainder(value, NINF), value)
1364
1365 # remainder(x, 0) and remainder(infinity, x) for non-NaN x are invalid
1366 # operations according to IEEE 754-2008 7.2(f), and should raise.
1367 for value in [NINF, -2.3, -0.0, 0.0, 2.3, INF]:
1368 with self.assertRaises(ValueError):
1369 math.remainder(INF, value)
1370 with self.assertRaises(ValueError):
1371 math.remainder(NINF, value)
1372 with self.assertRaises(ValueError):
1373 math.remainder(value, 0.0)
1374 with self.assertRaises(ValueError):
1375 math.remainder(value, -0.0)
1376
Thomas Wouters89f507f2006-12-13 04:49:30 +00001377 def testSin(self):
1378 self.assertRaises(TypeError, math.sin)
1379 self.ftest('sin(0)', math.sin(0), 0)
1380 self.ftest('sin(pi/2)', math.sin(math.pi/2), 1)
1381 self.ftest('sin(-pi/2)', math.sin(-math.pi/2), -1)
Christian Heimes53876d92008-04-19 00:31:39 +00001382 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001383 self.assertTrue(math.isnan(math.sin(INF)))
1384 self.assertTrue(math.isnan(math.sin(NINF)))
Christian Heimes53876d92008-04-19 00:31:39 +00001385 except ValueError:
1386 self.assertRaises(ValueError, math.sin, INF)
1387 self.assertRaises(ValueError, math.sin, NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001388 self.assertTrue(math.isnan(math.sin(NAN)))
Guido van Rossumfcce6301996-08-08 18:26:25 +00001389
Thomas Wouters89f507f2006-12-13 04:49:30 +00001390 def testSinh(self):
1391 self.assertRaises(TypeError, math.sinh)
1392 self.ftest('sinh(0)', math.sinh(0), 0)
1393 self.ftest('sinh(1)**2-cosh(1)**2', math.sinh(1)**2-math.cosh(1)**2, -1)
1394 self.ftest('sinh(1)+sinh(-1)', math.sinh(1)+math.sinh(-1), 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001395 self.assertEqual(math.sinh(INF), INF)
1396 self.assertEqual(math.sinh(NINF), NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001397 self.assertTrue(math.isnan(math.sinh(NAN)))
Tim Peters1d120612000-10-12 06:10:25 +00001398
Thomas Wouters89f507f2006-12-13 04:49:30 +00001399 def testSqrt(self):
1400 self.assertRaises(TypeError, math.sqrt)
1401 self.ftest('sqrt(0)', math.sqrt(0), 0)
1402 self.ftest('sqrt(1)', math.sqrt(1), 1)
1403 self.ftest('sqrt(4)', math.sqrt(4), 2)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001404 self.assertEqual(math.sqrt(INF), INF)
Mark Dickinson31ba1c32016-09-04 12:29:14 +01001405 self.assertRaises(ValueError, math.sqrt, -1)
Christian Heimes53876d92008-04-19 00:31:39 +00001406 self.assertRaises(ValueError, math.sqrt, NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001407 self.assertTrue(math.isnan(math.sqrt(NAN)))
Tim Peters1d120612000-10-12 06:10:25 +00001408
Thomas Wouters89f507f2006-12-13 04:49:30 +00001409 def testTan(self):
1410 self.assertRaises(TypeError, math.tan)
1411 self.ftest('tan(0)', math.tan(0), 0)
1412 self.ftest('tan(pi/4)', math.tan(math.pi/4), 1)
1413 self.ftest('tan(-pi/4)', math.tan(-math.pi/4), -1)
Christian Heimes53876d92008-04-19 00:31:39 +00001414 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001415 self.assertTrue(math.isnan(math.tan(INF)))
1416 self.assertTrue(math.isnan(math.tan(NINF)))
Christian Heimes53876d92008-04-19 00:31:39 +00001417 except:
1418 self.assertRaises(ValueError, math.tan, INF)
1419 self.assertRaises(ValueError, math.tan, NINF)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001420 self.assertTrue(math.isnan(math.tan(NAN)))
Tim Peters1d120612000-10-12 06:10:25 +00001421
Thomas Wouters89f507f2006-12-13 04:49:30 +00001422 def testTanh(self):
1423 self.assertRaises(TypeError, math.tanh)
1424 self.ftest('tanh(0)', math.tanh(0), 0)
Mark Dickinson96f774d2016-09-03 19:30:22 +01001425 self.ftest('tanh(1)+tanh(-1)', math.tanh(1)+math.tanh(-1), 0,
1426 abs_tol=ulp(1))
Christian Heimes53876d92008-04-19 00:31:39 +00001427 self.ftest('tanh(inf)', math.tanh(INF), 1)
1428 self.ftest('tanh(-inf)', math.tanh(NINF), -1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001429 self.assertTrue(math.isnan(math.tanh(NAN)))
Victor Stinnerbe3da382010-11-07 14:14:27 +00001430
1431 @requires_IEEE_754
Victor Stinnerbe3da382010-11-07 14:14:27 +00001432 def testTanhSign(self):
Christian Heimese57950f2008-04-21 13:08:03 +00001433 # check that tanh(-0.) == -0. on IEEE 754 systems
Victor Stinnerbe3da382010-11-07 14:14:27 +00001434 self.assertEqual(math.tanh(-0.), -0.)
1435 self.assertEqual(math.copysign(1., math.tanh(-0.)),
1436 math.copysign(1., -0.))
Tim Peters1d120612000-10-12 06:10:25 +00001437
Christian Heimes400adb02008-02-01 08:12:03 +00001438 def test_trunc(self):
1439 self.assertEqual(math.trunc(1), 1)
1440 self.assertEqual(math.trunc(-1), -1)
1441 self.assertEqual(type(math.trunc(1)), int)
1442 self.assertEqual(type(math.trunc(1.5)), int)
1443 self.assertEqual(math.trunc(1.5), 1)
1444 self.assertEqual(math.trunc(-1.5), -1)
1445 self.assertEqual(math.trunc(1.999999), 1)
1446 self.assertEqual(math.trunc(-1.999999), -1)
1447 self.assertEqual(math.trunc(-0.999999), -0)
1448 self.assertEqual(math.trunc(-100.999), -100)
1449
1450 class TestTrunc(object):
1451 def __trunc__(self):
1452 return 23
1453
1454 class TestNoTrunc(object):
1455 pass
1456
1457 self.assertEqual(math.trunc(TestTrunc()), 23)
1458
1459 self.assertRaises(TypeError, math.trunc)
1460 self.assertRaises(TypeError, math.trunc, 1, 2)
1461 self.assertRaises(TypeError, math.trunc, TestNoTrunc())
1462
Mark Dickinson8e0c9962010-07-11 17:38:24 +00001463 def testIsfinite(self):
1464 self.assertTrue(math.isfinite(0.0))
1465 self.assertTrue(math.isfinite(-0.0))
1466 self.assertTrue(math.isfinite(1.0))
1467 self.assertTrue(math.isfinite(-1.0))
1468 self.assertFalse(math.isfinite(float("nan")))
1469 self.assertFalse(math.isfinite(float("inf")))
1470 self.assertFalse(math.isfinite(float("-inf")))
1471
Christian Heimes072c0f12008-01-03 23:01:04 +00001472 def testIsnan(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001473 self.assertTrue(math.isnan(float("nan")))
Mark Dickinson31ba1c32016-09-04 12:29:14 +01001474 self.assertTrue(math.isnan(float("-nan")))
1475 self.assertTrue(math.isnan(float("inf") * 0.))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001476 self.assertFalse(math.isnan(float("inf")))
1477 self.assertFalse(math.isnan(0.))
1478 self.assertFalse(math.isnan(1.))
Christian Heimes072c0f12008-01-03 23:01:04 +00001479
1480 def testIsinf(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001481 self.assertTrue(math.isinf(float("inf")))
1482 self.assertTrue(math.isinf(float("-inf")))
1483 self.assertTrue(math.isinf(1E400))
1484 self.assertTrue(math.isinf(-1E400))
1485 self.assertFalse(math.isinf(float("nan")))
1486 self.assertFalse(math.isinf(0.))
1487 self.assertFalse(math.isinf(1.))
Christian Heimes072c0f12008-01-03 23:01:04 +00001488
Mark Dickinsona5d0c7c2015-01-11 11:55:29 +00001489 @requires_IEEE_754
1490 def test_nan_constant(self):
1491 self.assertTrue(math.isnan(math.nan))
1492
1493 @requires_IEEE_754
1494 def test_inf_constant(self):
1495 self.assertTrue(math.isinf(math.inf))
1496 self.assertGreater(math.inf, 0.0)
1497 self.assertEqual(math.inf, float("inf"))
1498 self.assertEqual(-math.inf, float("-inf"))
1499
Thomas Wouters89f507f2006-12-13 04:49:30 +00001500 # RED_FLAG 16-Oct-2000 Tim
1501 # While 2.0 is more consistent about exceptions than previous releases, it
1502 # still fails this part of the test on some platforms. For now, we only
1503 # *run* test_exceptions() in verbose mode, so that this isn't normally
1504 # tested.
Serhiy Storchaka43767632013-11-03 21:31:38 +02001505 @unittest.skipUnless(verbose, 'requires verbose mode')
1506 def test_exceptions(self):
1507 try:
1508 x = math.exp(-1000000000)
1509 except:
1510 # mathmodule.c is failing to weed out underflows from libm, or
1511 # we've got an fp format with huge dynamic range
1512 self.fail("underflowing exp() should not have raised "
1513 "an exception")
1514 if x != 0:
1515 self.fail("underflowing exp() should have returned 0")
Tim Peters98c81842000-10-16 17:35:13 +00001516
Serhiy Storchaka43767632013-11-03 21:31:38 +02001517 # If this fails, probably using a strict IEEE-754 conforming libm, and x
1518 # is +Inf afterwards. But Python wants overflows detected by default.
1519 try:
1520 x = math.exp(1000000000)
1521 except OverflowError:
1522 pass
1523 else:
1524 self.fail("overflowing exp() didn't trigger OverflowError")
Thomas Wouters89f507f2006-12-13 04:49:30 +00001525
Serhiy Storchaka43767632013-11-03 21:31:38 +02001526 # If this fails, it could be a puzzle. One odd possibility is that
1527 # mathmodule.c's macros are getting confused while comparing
1528 # Inf (HUGE_VAL) to a NaN, and artificially setting errno to ERANGE
1529 # as a result (and so raising OverflowError instead).
1530 try:
1531 x = math.sqrt(-1.0)
1532 except ValueError:
1533 pass
1534 else:
1535 self.fail("sqrt(-1) didn't raise ValueError")
Thomas Wouters89f507f2006-12-13 04:49:30 +00001536
Mark Dickinson63566232009-09-18 21:04:19 +00001537 @requires_IEEE_754
Christian Heimes53876d92008-04-19 00:31:39 +00001538 def test_testfile(self):
Mark Dickinson85746542016-09-04 09:58:51 +01001539 # Some tests need to be skipped on ancient OS X versions.
1540 # See issue #27953.
1541 SKIP_ON_TIGER = {'tan0064'}
1542
1543 osx_version = None
1544 if sys.platform == 'darwin':
1545 version_txt = platform.mac_ver()[0]
1546 try:
1547 osx_version = tuple(map(int, version_txt.split('.')))
1548 except ValueError:
1549 pass
1550
Mark Dickinson96f774d2016-09-03 19:30:22 +01001551 fail_fmt = "{}: {}({!r}): {}"
1552
1553 failures = []
Christian Heimes53876d92008-04-19 00:31:39 +00001554 for id, fn, ar, ai, er, ei, flags in parse_testfile(test_file):
Mark Dickinson96f774d2016-09-03 19:30:22 +01001555 # Skip if either the input or result is complex
1556 if ai != 0.0 or ei != 0.0:
Christian Heimes53876d92008-04-19 00:31:39 +00001557 continue
1558 if fn in ['rect', 'polar']:
1559 # no real versions of rect, polar
1560 continue
Mark Dickinson85746542016-09-04 09:58:51 +01001561 # Skip certain tests on OS X 10.4.
1562 if osx_version is not None and osx_version < (10, 5):
1563 if id in SKIP_ON_TIGER:
1564 continue
Mark Dickinson96f774d2016-09-03 19:30:22 +01001565
Christian Heimes53876d92008-04-19 00:31:39 +00001566 func = getattr(math, fn)
Mark Dickinson96f774d2016-09-03 19:30:22 +01001567
1568 if 'invalid' in flags or 'divide-by-zero' in flags:
1569 er = 'ValueError'
1570 elif 'overflow' in flags:
1571 er = 'OverflowError'
1572
Christian Heimesa342c012008-04-20 21:01:16 +00001573 try:
1574 result = func(ar)
Mark Dickinson96f774d2016-09-03 19:30:22 +01001575 except ValueError:
1576 result = 'ValueError'
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001577 except OverflowError:
Mark Dickinson96f774d2016-09-03 19:30:22 +01001578 result = 'OverflowError'
1579
1580 # Default tolerances
1581 ulp_tol, abs_tol = 5, 0.0
1582
1583 failure = result_check(er, result, ulp_tol, abs_tol)
1584 if failure is None:
1585 continue
1586
1587 msg = fail_fmt.format(id, fn, ar, failure)
1588 failures.append(msg)
1589
1590 if failures:
1591 self.fail('Failures in test_testfile:\n ' +
1592 '\n '.join(failures))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001593
Victor Stinnerbe3da382010-11-07 14:14:27 +00001594 @requires_IEEE_754
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001595 def test_mtestfile(self):
Mark Dickinson96f774d2016-09-03 19:30:22 +01001596 fail_fmt = "{}: {}({!r}): {}"
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001597
1598 failures = []
1599 for id, fn, arg, expected, flags in parse_mtestfile(math_testcases):
1600 func = getattr(math, fn)
1601
1602 if 'invalid' in flags or 'divide-by-zero' in flags:
1603 expected = 'ValueError'
1604 elif 'overflow' in flags:
1605 expected = 'OverflowError'
1606
1607 try:
1608 got = func(arg)
1609 except ValueError:
1610 got = 'ValueError'
1611 except OverflowError:
1612 got = 'OverflowError'
1613
Mark Dickinson96f774d2016-09-03 19:30:22 +01001614 # Default tolerances
1615 ulp_tol, abs_tol = 5, 0.0
Mark Dickinsonbcdf9da2010-06-13 10:52:38 +00001616
Mark Dickinson96f774d2016-09-03 19:30:22 +01001617 # Exceptions to the defaults
1618 if fn == 'gamma':
1619 # Experimental results on one platform gave
1620 # an accuracy of <= 10 ulps across the entire float
1621 # domain. We weaken that to require 20 ulp accuracy.
1622 ulp_tol = 20
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001623
Mark Dickinson96f774d2016-09-03 19:30:22 +01001624 elif fn == 'lgamma':
1625 # we use a weaker accuracy test for lgamma;
1626 # lgamma only achieves an absolute error of
1627 # a few multiples of the machine accuracy, in
1628 # general.
1629 abs_tol = 1e-15
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001630
Mark Dickinson96f774d2016-09-03 19:30:22 +01001631 elif fn == 'erfc' and arg >= 0.0:
1632 # erfc has less-than-ideal accuracy for large
1633 # arguments (x ~ 25 or so), mainly due to the
1634 # error involved in computing exp(-x*x).
1635 #
1636 # Observed between CPython and mpmath at 25 dp:
1637 # x < 0 : err <= 2 ulp
1638 # 0 <= x < 1 : err <= 10 ulp
1639 # 1 <= x < 10 : err <= 100 ulp
1640 # 10 <= x < 20 : err <= 300 ulp
1641 # 20 <= x : < 600 ulp
1642 #
1643 if arg < 1.0:
1644 ulp_tol = 10
1645 elif arg < 10.0:
1646 ulp_tol = 100
1647 else:
1648 ulp_tol = 1000
1649
1650 failure = result_check(expected, got, ulp_tol, abs_tol)
1651 if failure is None:
1652 continue
1653
1654 msg = fail_fmt.format(id, fn, arg, failure)
1655 failures.append(msg)
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001656
1657 if failures:
1658 self.fail('Failures in test_mtestfile:\n ' +
1659 '\n '.join(failures))
1660
Pablo Galindo04114112019-03-09 19:18:08 +00001661 def test_prod(self):
1662 prod = math.prod
1663 self.assertEqual(prod([]), 1)
1664 self.assertEqual(prod([], start=5), 5)
1665 self.assertEqual(prod(list(range(2,8))), 5040)
1666 self.assertEqual(prod(iter(list(range(2,8)))), 5040)
1667 self.assertEqual(prod(range(1, 10), start=10), 3628800)
1668
1669 self.assertEqual(prod([1, 2, 3, 4, 5]), 120)
1670 self.assertEqual(prod([1.0, 2.0, 3.0, 4.0, 5.0]), 120.0)
1671 self.assertEqual(prod([1, 2, 3, 4.0, 5.0]), 120.0)
1672 self.assertEqual(prod([1.0, 2.0, 3.0, 4, 5]), 120.0)
1673
1674 # Test overflow in fast-path for integers
1675 self.assertEqual(prod([1, 1, 2**32, 1, 1]), 2**32)
1676 # Test overflow in fast-path for floats
1677 self.assertEqual(prod([1.0, 1.0, 2**32, 1, 1]), float(2**32))
1678
1679 self.assertRaises(TypeError, prod)
1680 self.assertRaises(TypeError, prod, 42)
1681 self.assertRaises(TypeError, prod, ['a', 'b', 'c'])
1682 self.assertRaises(TypeError, prod, ['a', 'b', 'c'], '')
1683 self.assertRaises(TypeError, prod, [b'a', b'c'], b'')
1684 values = [bytearray(b'a'), bytearray(b'b')]
1685 self.assertRaises(TypeError, prod, values, bytearray(b''))
1686 self.assertRaises(TypeError, prod, [[1], [2], [3]])
1687 self.assertRaises(TypeError, prod, [{2:3}])
1688 self.assertRaises(TypeError, prod, [{2:3}]*2, {2:3})
1689 self.assertRaises(TypeError, prod, [[1], [2], [3]], [])
1690 with self.assertRaises(TypeError):
1691 prod([10, 20], [30, 40]) # start is a keyword-only argument
1692
1693 self.assertEqual(prod([0, 1, 2, 3]), 0)
1694 self.assertEqual(prod([1, 0, 2, 3]), 0)
1695 self.assertEqual(prod([1, 2, 3, 0]), 0)
1696
1697 def _naive_prod(iterable, start=1):
1698 for elem in iterable:
1699 start *= elem
1700 return start
1701
1702 # Big integers
1703
1704 iterable = range(1, 10000)
1705 self.assertEqual(prod(iterable), _naive_prod(iterable))
1706 iterable = range(-10000, -1)
1707 self.assertEqual(prod(iterable), _naive_prod(iterable))
1708 iterable = range(-1000, 1000)
1709 self.assertEqual(prod(iterable), 0)
1710
1711 # Big floats
1712
1713 iterable = [float(x) for x in range(1, 1000)]
1714 self.assertEqual(prod(iterable), _naive_prod(iterable))
1715 iterable = [float(x) for x in range(-1000, -1)]
1716 self.assertEqual(prod(iterable), _naive_prod(iterable))
1717 iterable = [float(x) for x in range(-1000, 1000)]
1718 self.assertIsNaN(prod(iterable))
1719
1720 # Float tests
1721
1722 self.assertIsNaN(prod([1, 2, 3, float("nan"), 2, 3]))
1723 self.assertIsNaN(prod([1, 0, float("nan"), 2, 3]))
1724 self.assertIsNaN(prod([1, float("nan"), 0, 3]))
1725 self.assertIsNaN(prod([1, float("inf"), float("nan"),3]))
1726 self.assertIsNaN(prod([1, float("-inf"), float("nan"),3]))
1727 self.assertIsNaN(prod([1, float("nan"), float("inf"),3]))
1728 self.assertIsNaN(prod([1, float("nan"), float("-inf"),3]))
1729
1730 self.assertEqual(prod([1, 2, 3, float('inf'),-3,4]), float('-inf'))
1731 self.assertEqual(prod([1, 2, 3, float('-inf'),-3,4]), float('inf'))
1732
1733 self.assertIsNaN(prod([1,2,0,float('inf'), -3, 4]))
1734 self.assertIsNaN(prod([1,2,0,float('-inf'), -3, 4]))
1735 self.assertIsNaN(prod([1, 2, 3, float('inf'), -3, 0, 3]))
1736 self.assertIsNaN(prod([1, 2, 3, float('-inf'), -3, 0, 2]))
1737
1738 # Type preservation
1739
1740 self.assertEqual(type(prod([1, 2, 3, 4, 5, 6])), int)
1741 self.assertEqual(type(prod([1, 2.0, 3, 4, 5, 6])), float)
1742 self.assertEqual(type(prod(range(1, 10000))), int)
1743 self.assertEqual(type(prod(range(1, 10000), start=1.0)), float)
1744 self.assertEqual(type(prod([1, decimal.Decimal(2.0), 3, 4, 5, 6])),
1745 decimal.Decimal)
1746
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001747 def testPerm(self):
1748 perm = math.perm
1749 factorial = math.factorial
Kyle Stanley24b5b362019-07-21 22:48:45 -04001750 # Test if factorial definition is satisfied
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001751 for n in range(100):
1752 for k in range(n + 1):
1753 self.assertEqual(perm(n, k),
1754 factorial(n) // factorial(n - k))
1755
1756 # Test for Pascal's identity
1757 for n in range(1, 100):
1758 for k in range(1, n):
1759 self.assertEqual(perm(n, k), perm(n - 1, k - 1) * k + perm(n - 1, k))
1760
1761 # Test corner cases
1762 for n in range(1, 100):
1763 self.assertEqual(perm(n, 0), 1)
1764 self.assertEqual(perm(n, 1), n)
1765 self.assertEqual(perm(n, n), factorial(n))
1766
Miss Islington (bot)feaceaa2019-06-08 09:17:33 -07001767 # Test one argument form
1768 for n in range(20):
1769 self.assertEqual(perm(n), factorial(n))
1770 self.assertEqual(perm(n, None), factorial(n))
1771
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001772 # Raises TypeError if any argument is non-integer or argument count is
Miss Islington (bot)feaceaa2019-06-08 09:17:33 -07001773 # not 1 or 2
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001774 self.assertRaises(TypeError, perm, 10, 1.0)
1775 self.assertRaises(TypeError, perm, 10, decimal.Decimal(1.0))
1776 self.assertRaises(TypeError, perm, 10, "1")
1777 self.assertRaises(TypeError, perm, 10.0, 1)
1778 self.assertRaises(TypeError, perm, decimal.Decimal(10.0), 1)
1779 self.assertRaises(TypeError, perm, "10", 1)
1780
Miss Islington (bot)feaceaa2019-06-08 09:17:33 -07001781 self.assertRaises(TypeError, perm)
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001782 self.assertRaises(TypeError, perm, 10, 1, 3)
1783 self.assertRaises(TypeError, perm)
1784
1785 # Raises Value error if not k or n are negative numbers
1786 self.assertRaises(ValueError, perm, -1, 1)
1787 self.assertRaises(ValueError, perm, -2**1000, 1)
1788 self.assertRaises(ValueError, perm, 1, -1)
1789 self.assertRaises(ValueError, perm, 1, -2**1000)
1790
Raymond Hettinger963eb0f2019-06-04 01:23:06 -07001791 # Returns zero if k is greater than n
1792 self.assertEqual(perm(1, 2), 0)
1793 self.assertEqual(perm(1, 2**1000), 0)
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001794
1795 n = 2**1000
1796 self.assertEqual(perm(n, 0), 1)
1797 self.assertEqual(perm(n, 1), n)
1798 self.assertEqual(perm(n, 2), n * (n-1))
Serhiy Storchaka914d6b72019-06-23 17:50:04 +03001799 if support.check_impl_detail(cpython=True):
1800 self.assertRaises(OverflowError, perm, n, n)
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001801
1802 for n, k in (True, True), (True, False), (False, False):
1803 self.assertEqual(perm(n, k), 1)
1804 self.assertIs(type(perm(n, k)), int)
1805 self.assertEqual(perm(IntSubclass(5), IntSubclass(2)), 20)
1806 self.assertEqual(perm(MyIndexable(5), MyIndexable(2)), 20)
1807 for k in range(3):
1808 self.assertIs(type(perm(IntSubclass(5), IntSubclass(k))), int)
1809 self.assertIs(type(perm(MyIndexable(5), MyIndexable(k))), int)
1810
Yash Aggarwal4a686502019-06-01 12:51:27 +05301811 def testComb(self):
1812 comb = math.comb
1813 factorial = math.factorial
Kyle Stanley24b5b362019-07-21 22:48:45 -04001814 # Test if factorial definition is satisfied
Yash Aggarwal4a686502019-06-01 12:51:27 +05301815 for n in range(100):
1816 for k in range(n + 1):
1817 self.assertEqual(comb(n, k), factorial(n)
1818 // (factorial(k) * factorial(n - k)))
1819
1820 # Test for Pascal's identity
1821 for n in range(1, 100):
1822 for k in range(1, n):
1823 self.assertEqual(comb(n, k), comb(n - 1, k - 1) + comb(n - 1, k))
1824
1825 # Test corner cases
1826 for n in range(100):
1827 self.assertEqual(comb(n, 0), 1)
1828 self.assertEqual(comb(n, n), 1)
1829
1830 for n in range(1, 100):
1831 self.assertEqual(comb(n, 1), n)
1832 self.assertEqual(comb(n, n - 1), n)
1833
1834 # Test Symmetry
1835 for n in range(100):
1836 for k in range(n // 2):
1837 self.assertEqual(comb(n, k), comb(n, n - k))
1838
1839 # Raises TypeError if any argument is non-integer or argument count is
1840 # not 2
1841 self.assertRaises(TypeError, comb, 10, 1.0)
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001842 self.assertRaises(TypeError, comb, 10, decimal.Decimal(1.0))
Yash Aggarwal4a686502019-06-01 12:51:27 +05301843 self.assertRaises(TypeError, comb, 10, "1")
Yash Aggarwal4a686502019-06-01 12:51:27 +05301844 self.assertRaises(TypeError, comb, 10.0, 1)
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001845 self.assertRaises(TypeError, comb, decimal.Decimal(10.0), 1)
1846 self.assertRaises(TypeError, comb, "10", 1)
Yash Aggarwal4a686502019-06-01 12:51:27 +05301847
1848 self.assertRaises(TypeError, comb, 10)
1849 self.assertRaises(TypeError, comb, 10, 1, 3)
1850 self.assertRaises(TypeError, comb)
1851
1852 # Raises Value error if not k or n are negative numbers
1853 self.assertRaises(ValueError, comb, -1, 1)
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001854 self.assertRaises(ValueError, comb, -2**1000, 1)
Yash Aggarwal4a686502019-06-01 12:51:27 +05301855 self.assertRaises(ValueError, comb, 1, -1)
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001856 self.assertRaises(ValueError, comb, 1, -2**1000)
Yash Aggarwal4a686502019-06-01 12:51:27 +05301857
Raymond Hettinger963eb0f2019-06-04 01:23:06 -07001858 # Returns zero if k is greater than n
1859 self.assertEqual(comb(1, 2), 0)
1860 self.assertEqual(comb(1, 2**1000), 0)
Yash Aggarwal4a686502019-06-01 12:51:27 +05301861
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001862 n = 2**1000
1863 self.assertEqual(comb(n, 0), 1)
1864 self.assertEqual(comb(n, 1), n)
1865 self.assertEqual(comb(n, 2), n * (n-1) // 2)
1866 self.assertEqual(comb(n, n), 1)
1867 self.assertEqual(comb(n, n-1), n)
1868 self.assertEqual(comb(n, n-2), n * (n-1) // 2)
Serhiy Storchaka914d6b72019-06-23 17:50:04 +03001869 if support.check_impl_detail(cpython=True):
1870 self.assertRaises(OverflowError, comb, n, n//2)
Yash Aggarwal4a686502019-06-01 12:51:27 +05301871
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001872 for n, k in (True, True), (True, False), (False, False):
1873 self.assertEqual(comb(n, k), 1)
1874 self.assertIs(type(comb(n, k)), int)
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001875 self.assertEqual(comb(IntSubclass(5), IntSubclass(2)), 10)
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03001876 self.assertEqual(comb(MyIndexable(5), MyIndexable(2)), 10)
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03001877 for k in range(3):
1878 self.assertIs(type(comb(IntSubclass(5), IntSubclass(k))), int)
1879 self.assertIs(type(comb(MyIndexable(5), MyIndexable(k))), int)
Yash Aggarwal4a686502019-06-01 12:51:27 +05301880
Mark Dickinsone634a8a2020-03-14 11:38:52 +00001881 def test_issue39871(self):
1882 # A SystemError should not be raised if the first arg to atan2(),
1883 # copysign(), or remainder() cannot be converted to a float.
1884 class F:
1885 def __float__(self):
1886 self.converted = True
1887 1/0
1888 for func in math.atan2, math.copysign, math.remainder:
1889 y = F()
1890 with self.assertRaises(TypeError):
1891 func("not a number", y)
1892
1893 # There should not have been any attempt to convert the second
1894 # argument to a float.
1895 self.assertFalse(getattr(y, "converted", False))
1896
Victor Stinnerf4e3e1c2020-01-21 15:04:33 +01001897 # Custom assertions.
1898
1899 def assertIsNaN(self, value):
1900 if not math.isnan(value):
1901 self.fail("Expected a NaN, got {!r}.".format(value))
1902
1903
1904class IsCloseTests(unittest.TestCase):
1905 isclose = math.isclose # subclasses should override this
1906
1907 def assertIsClose(self, a, b, *args, **kwargs):
1908 self.assertTrue(self.isclose(a, b, *args, **kwargs),
1909 msg="%s and %s should be close!" % (a, b))
1910
1911 def assertIsNotClose(self, a, b, *args, **kwargs):
1912 self.assertFalse(self.isclose(a, b, *args, **kwargs),
1913 msg="%s and %s should not be close!" % (a, b))
1914
1915 def assertAllClose(self, examples, *args, **kwargs):
1916 for a, b in examples:
1917 self.assertIsClose(a, b, *args, **kwargs)
1918
1919 def assertAllNotClose(self, examples, *args, **kwargs):
1920 for a, b in examples:
1921 self.assertIsNotClose(a, b, *args, **kwargs)
1922
1923 def test_negative_tolerances(self):
1924 # ValueError should be raised if either tolerance is less than zero
1925 with self.assertRaises(ValueError):
1926 self.assertIsClose(1, 1, rel_tol=-1e-100)
1927 with self.assertRaises(ValueError):
1928 self.assertIsClose(1, 1, rel_tol=1e-100, abs_tol=-1e10)
1929
1930 def test_identical(self):
1931 # identical values must test as close
1932 identical_examples = [(2.0, 2.0),
1933 (0.1e200, 0.1e200),
1934 (1.123e-300, 1.123e-300),
1935 (12345, 12345.0),
1936 (0.0, -0.0),
1937 (345678, 345678)]
1938 self.assertAllClose(identical_examples, rel_tol=0.0, abs_tol=0.0)
1939
1940 def test_eight_decimal_places(self):
1941 # examples that are close to 1e-8, but not 1e-9
1942 eight_decimal_places_examples = [(1e8, 1e8 + 1),
1943 (-1e-8, -1.000000009e-8),
1944 (1.12345678, 1.12345679)]
1945 self.assertAllClose(eight_decimal_places_examples, rel_tol=1e-8)
1946 self.assertAllNotClose(eight_decimal_places_examples, rel_tol=1e-9)
1947
1948 def test_near_zero(self):
1949 # values close to zero
1950 near_zero_examples = [(1e-9, 0.0),
1951 (-1e-9, 0.0),
1952 (-1e-150, 0.0)]
1953 # these should not be close to any rel_tol
1954 self.assertAllNotClose(near_zero_examples, rel_tol=0.9)
1955 # these should be close to abs_tol=1e-8
1956 self.assertAllClose(near_zero_examples, abs_tol=1e-8)
1957
1958 def test_identical_infinite(self):
1959 # these are close regardless of tolerance -- i.e. they are equal
1960 self.assertIsClose(INF, INF)
1961 self.assertIsClose(INF, INF, abs_tol=0.0)
1962 self.assertIsClose(NINF, NINF)
1963 self.assertIsClose(NINF, NINF, abs_tol=0.0)
1964
1965 def test_inf_ninf_nan(self):
1966 # these should never be close (following IEEE 754 rules for equality)
1967 not_close_examples = [(NAN, NAN),
1968 (NAN, 1e-100),
1969 (1e-100, NAN),
1970 (INF, NAN),
1971 (NAN, INF),
1972 (INF, NINF),
1973 (INF, 1.0),
1974 (1.0, INF),
1975 (INF, 1e308),
1976 (1e308, INF)]
1977 # use largest reasonable tolerance
1978 self.assertAllNotClose(not_close_examples, abs_tol=0.999999999999999)
1979
1980 def test_zero_tolerance(self):
1981 # test with zero tolerance
1982 zero_tolerance_close_examples = [(1.0, 1.0),
1983 (-3.4, -3.4),
1984 (-1e-300, -1e-300)]
1985 self.assertAllClose(zero_tolerance_close_examples, rel_tol=0.0)
1986
1987 zero_tolerance_not_close_examples = [(1.0, 1.000000000000001),
1988 (0.99999999999999, 1.0),
1989 (1.0e200, .999999999999999e200)]
1990 self.assertAllNotClose(zero_tolerance_not_close_examples, rel_tol=0.0)
1991
1992 def test_asymmetry(self):
1993 # test the asymmetry example from PEP 485
1994 self.assertAllClose([(9, 10), (10, 9)], rel_tol=0.1)
1995
1996 def test_integers(self):
1997 # test with integer values
1998 integer_examples = [(100000001, 100000000),
1999 (123456789, 123456788)]
2000
2001 self.assertAllClose(integer_examples, rel_tol=1e-8)
2002 self.assertAllNotClose(integer_examples, rel_tol=1e-9)
2003
2004 def test_decimals(self):
2005 # test with Decimal values
2006 from decimal import Decimal
2007
2008 decimal_examples = [(Decimal('1.00000001'), Decimal('1.0')),
2009 (Decimal('1.00000001e-20'), Decimal('1.0e-20')),
2010 (Decimal('1.00000001e-100'), Decimal('1.0e-100')),
2011 (Decimal('1.00000001e20'), Decimal('1.0e20'))]
2012 self.assertAllClose(decimal_examples, rel_tol=1e-8)
2013 self.assertAllNotClose(decimal_examples, rel_tol=1e-9)
2014
2015 def test_fractions(self):
2016 # test with Fraction values
2017 from fractions import Fraction
2018
2019 fraction_examples = [
2020 (Fraction(1, 100000000) + 1, Fraction(1)),
2021 (Fraction(100000001), Fraction(100000000)),
2022 (Fraction(10**8 + 1, 10**28), Fraction(1, 10**20))]
2023 self.assertAllClose(fraction_examples, rel_tol=1e-8)
2024 self.assertAllNotClose(fraction_examples, rel_tol=1e-9)
2025
Pablo Galindo42079072019-02-10 19:56:58 +00002026
Thomas Wouters89f507f2006-12-13 04:49:30 +00002027def test_main():
Christian Heimes53876d92008-04-19 00:31:39 +00002028 from doctest import DocFileSuite
2029 suite = unittest.TestSuite()
2030 suite.addTest(unittest.makeSuite(MathTests))
Tal Einatd5519ed2015-05-31 22:05:00 +03002031 suite.addTest(unittest.makeSuite(IsCloseTests))
Christian Heimes53876d92008-04-19 00:31:39 +00002032 suite.addTest(DocFileSuite("ieee754.txt"))
2033 run_unittest(suite)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002034
2035if __name__ == '__main__':
2036 test_main()