annotate Lib/test/test_complex.py @ 25838:8540887bcec6 2.2

Backport of 2.183: Fix memory leak in add_subclass() found by NealN with valgrind.
author Guido van Rossum <guido@python.org>
date Fri, 18 Oct 2002 13:42:21 +0000
parents 6da6091a31ee
children ff70e5634ae9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19791
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
1 from test_support import TestFailed
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2 from random import random
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3
21401
6da6091a31ee Add a comment explaining what these tests are for, and where to look for
Fred Drake <fdrake@acm.org>
parents: 19791
diff changeset
4 # These tests ensure that complex math does the right thing; tests of
6da6091a31ee Add a comment explaining what these tests are for, and where to look for
Fred Drake <fdrake@acm.org>
parents: 19791
diff changeset
5 # the complex() function/constructor are in test_b1.py.
6da6091a31ee Add a comment explaining what these tests are for, and where to look for
Fred Drake <fdrake@acm.org>
parents: 19791
diff changeset
6
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
7 # XXX need many, many more tests here.
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
8
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
9 nerrors = 0
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
10
19791
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
11 def check_close_real(x, y, eps=1e-9):
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
12 """Return true iff floats x and y "are close\""""
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
13 # put the one with larger magnitude second
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
14 if abs(x) > abs(y):
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
15 x, y = y, x
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
16 if y == 0:
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
17 return abs(x) < eps
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
18 if x == 0:
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
19 return abs(y) < eps
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
20 # check that relative difference < eps
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
21 return abs((x-y)/y) < eps
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
22
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
23 def check_close(x, y, eps=1e-9):
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
24 """Return true iff complexes x and y "are close\""""
19791
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
25 return check_close_real(x.real, y.real, eps) and \
c97dda238b36 Reverting to rev 1.2. Apparently gcc doesn't use the extended-precision
Tim Peters <tim.peters@gmail.com>
parents: 19790
diff changeset
26 check_close_real(x.imag, y.imag, eps)
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
27
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
28 def test_div(x, y):
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
29 """Compute complex z=x*y, and check that z/x==y and z/y==x."""
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
30 global nerrors
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
31 z = x * y
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
32 if x != 0:
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
33 q = z / x
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
34 if not check_close(q, y):
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
35 nerrors += 1
18004
64e1ea34b553 This division test was too stringent in its accuracy expectations for
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
36 print "%r / %r == %r but expected %r" % (z, x, q, y)
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
37 if y != 0:
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
38 q = z / y
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
39 if not check_close(q, x):
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
40 nerrors += 1
18004
64e1ea34b553 This division test was too stringent in its accuracy expectations for
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
41 print "%r / %r == %r but expected %r" % (z, y, q, x)
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
42
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
43 simple_real = [float(i) for i in range(-5, 6)]
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
44 simple_complex = [complex(x, y) for x in simple_real for y in simple_real]
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
45 for x in simple_complex:
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
46 for y in simple_complex:
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
47 test_div(x, y)
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
48
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
49 # A naive complex division algorithm (such as in 2.0) is very prone to
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
50 # nonsense errors for these (overflows and underflows).
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
51 test_div(complex(1e200, 1e200), 1+0j)
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
52 test_div(complex(1e-200, 1e-200), 1+0j)
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
53
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
54 # Just for fun.
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
55 for i in range(100):
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
56 test_div(complex(random(), random()),
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
57 complex(random(), random()))
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
58
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
59 try:
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
60 z = 1.0 / (0+0j)
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
61 except ZeroDivisionError:
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
62 pass
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
63 else:
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
64 nerrors += 1
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
65 raise TestFailed("Division by complex 0 didn't raise ZeroDivisionError")
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
66
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
67 if nerrors:
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
68 raise TestFailed("%d tests failed" % nerrors)