mirror of
https://github.com/python/cpython.git
synced 2025-07-14 06:45:17 +00:00

random inputs: if you ran the test 100 times, you could expect it to report a bogus failure. So loosened its expectations. Also changed the way failing tests are printed, so that when run under regrtest.py we get enough info to reproduce the failure.
65 lines
1.8 KiB
Python
65 lines
1.8 KiB
Python
from test_support import TestFailed
|
|
from random import random
|
|
|
|
# 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()))
|
|
|
|
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)
|