1 # Python test set -- math module
2 # XXXX Should not do tests around zero only
4 from test
.test_support
import TestFailed
, verbose
8 print 'math module, testing with eps', seps
11 def testit(name
, value
, expected
):
12 if abs(value
-expected
) > eps
:
13 raise TestFailed
, '%s returned %f, expected %f'%\
14 (name
, value
, expected
)
17 testit('pi', math
.pi
, 3.1415926)
18 testit('e', math
.e
, 2.7182818)
21 testit('acos(-1)', math
.acos(-1), math
.pi
)
22 testit('acos(0)', math
.acos(0), math
.pi
/2)
23 testit('acos(1)', math
.acos(1), 0)
26 testit('asin(-1)', math
.asin(-1), -math
.pi
/2)
27 testit('asin(0)', math
.asin(0), 0)
28 testit('asin(1)', math
.asin(1), math
.pi
/2)
31 testit('atan(-1)', math
.atan(-1), -math
.pi
/4)
32 testit('atan(0)', math
.atan(0), 0)
33 testit('atan(1)', math
.atan(1), math
.pi
/4)
36 testit('atan2(-1, 0)', math
.atan2(-1, 0), -math
.pi
/2)
37 testit('atan2(-1, 1)', math
.atan2(-1, 1), -math
.pi
/4)
38 testit('atan2(0, 1)', math
.atan2(0, 1), 0)
39 testit('atan2(1, 1)', math
.atan2(1, 1), math
.pi
/4)
40 testit('atan2(1, 0)', math
.atan2(1, 0), math
.pi
/2)
43 testit('ceil(0.5)', math
.ceil(0.5), 1)
44 testit('ceil(1.0)', math
.ceil(1.0), 1)
45 testit('ceil(1.5)', math
.ceil(1.5), 2)
46 testit('ceil(-0.5)', math
.ceil(-0.5), 0)
47 testit('ceil(-1.0)', math
.ceil(-1.0), -1)
48 testit('ceil(-1.5)', math
.ceil(-1.5), -1)
51 testit('cos(-pi/2)', math
.cos(-math
.pi
/2), 0)
52 testit('cos(0)', math
.cos(0), 1)
53 testit('cos(pi/2)', math
.cos(math
.pi
/2), 0)
54 testit('cos(pi)', math
.cos(math
.pi
), -1)
57 testit('cosh(0)', math
.cosh(0), 1)
58 testit('cosh(2)-2*cosh(1)**2', math
.cosh(2)-2*math
.cosh(1)**2, -1) # Thanks to Lambert
61 testit('degrees(pi)', math
.degrees(math
.pi
), 180.0)
62 testit('degrees(pi/2)', math
.degrees(math
.pi
/2), 90.0)
63 testit('degrees(-pi/4)', math
.degrees(-math
.pi
/4), -45.0)
66 testit('exp(-1)', math
.exp(-1), 1/math
.e
)
67 testit('exp(0)', math
.exp(0), 1)
68 testit('exp(1)', math
.exp(1), math
.e
)
71 testit('fabs(-1)', math
.fabs(-1), 1)
72 testit('fabs(0)', math
.fabs(0), 0)
73 testit('fabs(1)', math
.fabs(1), 1)
76 testit('floor(0.5)', math
.floor(0.5), 0)
77 testit('floor(1.0)', math
.floor(1.0), 1)
78 testit('floor(1.5)', math
.floor(1.5), 1)
79 testit('floor(-0.5)', math
.floor(-0.5), -1)
80 testit('floor(-1.0)', math
.floor(-1.0), -1)
81 testit('floor(-1.5)', math
.floor(-1.5), -2)
84 testit('fmod(10,1)', math
.fmod(10,1), 0)
85 testit('fmod(10,0.5)', math
.fmod(10,0.5), 0)
86 testit('fmod(10,1.5)', math
.fmod(10,1.5), 1)
87 testit('fmod(-10,1)', math
.fmod(-10,1), 0)
88 testit('fmod(-10,0.5)', math
.fmod(-10,0.5), 0)
89 testit('fmod(-10,1.5)', math
.fmod(-10,1.5), -1)
92 def testfrexp(name
, (mant
, exp
), (emant
, eexp
)):
93 if abs(mant
-emant
) > eps
or exp
!= eexp
:
94 raise TestFailed
, '%s returned %r, expected %r'%\
95 (name
, (mant
, exp
), (emant
,eexp
))
97 testfrexp('frexp(-1)', math
.frexp(-1), (-0.5, 1))
98 testfrexp('frexp(0)', math
.frexp(0), (0, 0))
99 testfrexp('frexp(1)', math
.frexp(1), (0.5, 1))
100 testfrexp('frexp(2)', math
.frexp(2), (0.5, 2))
103 testit('hypot(0,0)', math
.hypot(0,0), 0)
104 testit('hypot(3,4)', math
.hypot(3,4), 5)
107 testit('ldexp(0,1)', math
.ldexp(0,1), 0)
108 testit('ldexp(1,1)', math
.ldexp(1,1), 2)
109 testit('ldexp(1,-1)', math
.ldexp(1,-1), 0.5)
110 testit('ldexp(-1,1)', math
.ldexp(-1,1), -2)
113 testit('log(1/e)', math
.log(1/math
.e
), -1)
114 testit('log(1)', math
.log(1), 0)
115 testit('log(e)', math
.log(math
.e
), 1)
116 testit('log(32,2)', math
.log(32,2), 5)
117 testit('log(10**40, 10)', math
.log(10**40, 10), 40)
118 testit('log(10**40, 10**20)', math
.log(10**40, 10**20), 2)
121 testit('log10(0.1)', math
.log10(0.1), -1)
122 testit('log10(1)', math
.log10(1), 0)
123 testit('log10(10)', math
.log10(10), 1)
126 def testmodf(name
, (v1
, v2
), (e1
, e2
)):
127 if abs(v1
-e1
) > eps
or abs(v2
-e2
):
128 raise TestFailed
, '%s returned %r, expected %r'%\
129 (name
, (v1
,v2
), (e1
,e2
))
131 testmodf('modf(1.5)', math
.modf(1.5), (0.5, 1.0))
132 testmodf('modf(-1.5)', math
.modf(-1.5), (-0.5, -1.0))
135 testit('pow(0,1)', math
.pow(0,1), 0)
136 testit('pow(1,0)', math
.pow(1,0), 1)
137 testit('pow(2,1)', math
.pow(2,1), 2)
138 testit('pow(2,-1)', math
.pow(2,-1), 0.5)
141 testit('radians(180)', math
.radians(180), math
.pi
)
142 testit('radians(90)', math
.radians(90), math
.pi
/2)
143 testit('radians(-45)', math
.radians(-45), -math
.pi
/4)
146 testit('sin(0)', math
.sin(0), 0)
147 testit('sin(pi/2)', math
.sin(math
.pi
/2), 1)
148 testit('sin(-pi/2)', math
.sin(-math
.pi
/2), -1)
151 testit('sinh(0)', math
.sinh(0), 0)
152 testit('sinh(1)**2-cosh(1)**2', math
.sinh(1)**2-math
.cosh(1)**2, -1)
153 testit('sinh(1)+sinh(-1)', math
.sinh(1)+math
.sinh(-1), 0)
156 testit('sqrt(0)', math
.sqrt(0), 0)
157 testit('sqrt(1)', math
.sqrt(1), 1)
158 testit('sqrt(4)', math
.sqrt(4), 2)
161 testit('tan(0)', math
.tan(0), 0)
162 testit('tan(pi/4)', math
.tan(math
.pi
/4), 1)
163 testit('tan(-pi/4)', math
.tan(-math
.pi
/4), -1)
166 testit('tanh(0)', math
.tanh(0), 0)
167 testit('tanh(1)+tanh(-1)', math
.tanh(1)+math
.tanh(-1), 0)
169 # RED_FLAG 16-Oct-2000 Tim
170 # While 2.0 is more consistent about exceptions than previous releases, it
171 # still fails this part of the test on some platforms. For now, we only
172 # *run* test_exceptions() in verbose mode, so that this isn't normally
175 def test_exceptions():
178 x
= math
.exp(-1000000000)
180 # mathmodule.c is failing to weed out underflows from libm, or
181 # we've got an fp format with huge dynamic range
182 raise TestFailed("underflowing exp() should not have raised "
185 raise TestFailed("underflowing exp() should have returned 0")
187 # If this fails, probably using a strict IEEE-754 conforming libm, and x
188 # is +Inf afterwards. But Python wants overflows detected by default.
190 x
= math
.exp(1000000000)
191 except OverflowError:
194 raise TestFailed("overflowing exp() didn't trigger OverflowError")
196 # If this fails, it could be a puzzle. One odd possibility is that
197 # mathmodule.c's macros are getting confused while comparing
198 # Inf (HUGE_VAL) to a NaN, and artificially setting errno to ERANGE
199 # as a result (and so raising OverflowError instead).
205 raise TestFailed("sqrt(-1) didn't raise ValueError")