0
0
mirror of https://github.com/python/cpython.git synced 2024-12-23 16:54:14 +08:00
cpython/Lib/test/test_complex.py
Barry Warsaw 408b6d34de Complete the absolute import patch for the test suite. All relative
imports of test modules now import from the test package.  Other
related oddities are also fixed (like DeprecationWarning filters that
weren't specifying the full import part, etc.).  Also did a general
code cleanup to remove all "from test.test_support import *"'s.  Other
from...import *'s weren't changed.
2002-07-30 23:27:12 +00:00

92 lines
2.4 KiB
Python

from test.test_support import TestFailed, vereq
from random import random
# These tests ensure that complex math does the right thing; tests of
# the complex() function/constructor are in test_b1.py.
# XXX need many, many more tests here.
nerrors = 0
def check_close_real(x, y, eps=1e-9):
"""Return true iff floats x and y "are close\""""
# put the one with larger magnitude second
if abs(x) > abs(y):
x, y = y, x
if y == 0:
return abs(x) < eps
if x == 0:
return abs(y) < eps
# check that relative difference < eps
return abs((x-y)/y) < eps
def check_close(x, y, eps=1e-9):
"""Return true iff complexes x and y "are close\""""
return check_close_real(x.real, y.real, eps) and \
check_close_real(x.imag, y.imag, eps)
def test_div(x, y):
"""Compute complex z=x*y, and check that z/x==y and z/y==x."""
global nerrors
z = x * y
if x != 0:
q = z / x
if not check_close(q, y):
nerrors += 1
print "%r / %r == %r but expected %r" % (z, x, q, y)
if y != 0:
q = z / y
if not check_close(q, x):
nerrors += 1
print "%r / %r == %r but expected %r" % (z, y, q, x)
simple_real = [float(i) for i in range(-5, 6)]
simple_complex = [complex(x, y) for x in simple_real for y in simple_real]
for x in simple_complex:
for y in simple_complex:
test_div(x, y)
# A naive complex division algorithm (such as in 2.0) is very prone to
# nonsense errors for these (overflows and underflows).
test_div(complex(1e200, 1e200), 1+0j)
test_div(complex(1e-200, 1e-200), 1+0j)
# Just for fun.
for i in range(100):
test_div(complex(random(), random()),
complex(random(), random()))
for i in range(100):
if not complex(random() + 1e-6, random() + 1e-6):
raise TestFailed("complex(random(), random()) should be true")
if complex(0.0, 0.0):
raise TestFailed("complex(0.0, 0.0) should be false")
vereq(complex(5.3, 9.8).conjugate(), 5.3-9.8j)
try:
print int(5+3j)
except TypeError:
pass
else:
raise TestFailed("int(complex()) didn't raise TypeError")
try:
print float(5+3j)
except TypeError:
pass
else:
raise TestFailed("float(complex()) didn't raise TypeError")
try:
z = 1.0 / (0+0j)
except ZeroDivisionError:
pass
else:
nerrors += 1
raise TestFailed("Division by complex 0 didn't raise ZeroDivisionError")
if nerrors:
raise TestFailed("%d tests failed" % nerrors)