blob: 9faab71d83058fbdea36927404db8cd05cd8442d [file] [log] [blame]
Tim Peters0f336042001-03-18 08:21:57 +00001from test_support import TestFailed
2from random import random
3
4# XXX need many, many more tests here.
5
6nerrors = 0
7
Tim Peters0b76d3a2001-05-29 22:18:09 +00008def check_close_real(x, y, eps=1e-9):
Tim Peters0f336042001-03-18 08:21:57 +00009 """Return true iff floats x and y "are close\""""
10 # put the one with larger magnitude second
11 if abs(x) > abs(y):
12 x, y = y, x
13 if y == 0:
14 return abs(x) < eps
15 if x == 0:
16 return abs(y) < eps
17 # check that relative difference < eps
18 return abs((x-y)/y) < eps
19
Tim Peters0b76d3a2001-05-29 22:18:09 +000020def check_close(x, y, eps=1e-9):
Tim Peters0f336042001-03-18 08:21:57 +000021 """Return true iff complexes x and y "are close\""""
22 return check_close_real(x.real, y.real, eps) and \
23 check_close_real(x.imag, y.imag, eps)
24
25def test_div(x, y):
26 """Compute complex z=x*y, and check that z/x==y and z/y==x."""
27 global nerrors
28 z = x * y
29 if x != 0:
30 q = z / x
31 if not check_close(q, y):
32 nerrors += 1
Tim Peters0b76d3a2001-05-29 22:18:09 +000033 print "%r / %r == %r but expected %r" % (z, x, q, y)
Tim Peters0f336042001-03-18 08:21:57 +000034 if y != 0:
35 q = z / y
36 if not check_close(q, x):
37 nerrors += 1
Tim Peters0b76d3a2001-05-29 22:18:09 +000038 print "%r / %r == %r but expected %r" % (z, y, q, x)
Tim Peters0f336042001-03-18 08:21:57 +000039
40simple_real = [float(i) for i in range(-5, 6)]
41simple_complex = [complex(x, y) for x in simple_real for y in simple_real]
42for x in simple_complex:
43 for y in simple_complex:
44 test_div(x, y)
45
46# A naive complex division algorithm (such as in 2.0) is very prone to
47# nonsense errors for these (overflows and underflows).
48test_div(complex(1e200, 1e200), 1+0j)
49test_div(complex(1e-200, 1e-200), 1+0j)
50
51# Just for fun.
52for i in range(100):
53 test_div(complex(random(), random()),
54 complex(random(), random()))
55
56try:
57 z = 1.0 / (0+0j)
58except ZeroDivisionError:
59 pass
60else:
61 nerrors += 1
62 raise TestFailed("Division by complex 0 didn't raise ZeroDivisionError")
63
64if nerrors:
65 raise TestFailed("%d tests failed" % nerrors)