home *** CD-ROM | disk | FTP | other *** search
/ Komputer for Alle 2004 #2 / K-CD-2-2004.ISO / OpenOffice Sv / f_0397 / python-core-2.2.2 / lib / test / test_complex.py < prev    next >
Encoding:
Python Source  |  2003-07-18  |  1.9 KB  |  69 lines

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