fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / dynoplibs / trans.t
blob0e0a95276ca08c705e4ac4688f37c7a6600daac4
1 #!./parrot
2 # Copyright (C) 2001-2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/op/trans.t - Trancendental Mathematical Ops
9 =head1 SYNOPSIS
11         % prove t/op/trans.t
13 =head1 DESCRIPTION
15 Tests various transcendental operations
17 =cut
19 .loadlib 'trans_ops'
21 .sub main :main
22     .include 'test_more.pir'
23     .local num epsilon
24     epsilon = _epsilon()
26     plan(77)
28     test_sin_n(epsilon)
29     test_sin_i(epsilon)
30     test_cos_n(epsilon)
31     test_cos_i(epsilon)
32     test_tan_n(epsilon)
33     test_tan_i(epsilon)
34     test_cot_n(epsilon)
35     test_cot_i(epsilon)
36     test_sec_n(epsilon)
37     test_sec_i(epsilon)
38     test_csc_n(epsilon)
39     test_csc_i(epsilon)
40     test_atan_n(epsilon)
41     test_atan_i(epsilon)
42     test_asin_n(epsilon)
43     test_asin_i(epsilon)
44     test_acos_n(epsilon)
45     test_acos_i(epsilon)
46     test_asec_n(epsilon)
47     test_asec_i(epsilon)
48     test_cosh_n(epsilon)
49     test_cosh_i(epsilon)
50     integer_overflow_with_pow()
51     e_raised_pi_time_i__plus_1_equal_0()
52 .end
54 .sub _pi
55     .return (3.1415926535897)
56 .end
58 .sub _e
59     .return (2.7182818459045)
60 .end
62 .sub _epsilon
63     .return (0.0001)
64 .end
66 .sub test_sin_n
67     .param num epsilon
69     $N0 = sin 0.0
70     is($N0, 0.0, "sin(0.0)", epsilon)
72     $N0 = sin 1.0
73     is($N0, 0.841471, "sin(1.0)", epsilon)
75     $N1 = _pi()
76     $N0 = sin $N1
77     is($N0, 0.0, "sin(pi)", epsilon)
79     $N1 = _pi()
80     $N1 = $N1 / 2
81     $N0 = sin $N1
82     is($N0, 1.0, "sin(pi/2)", epsilon)
83 .end
85 .sub test_sin_i
86     .param num epsilon
88     $N0 = sin 0
89     is($N0, 0.0, "sin(0)", epsilon)
91     $N0 = sin 1
92     is($N0, 0.841471, "sin(1)", epsilon)
93 .end
95 .sub test_cos_n
96     .param num epsilon
98     $N0 = cos 0.0
99     is($N0, 1.0, "cos(0.0)", epsilon)
101     $N0 = cos 1.0
102     is($N0, 0.540302, "cos(1.0)", epsilon)
104     $N1 = _pi()
105     $N0 = cos $N1
106     is($N0, -1.0, "cos(pi)", epsilon)
108     $N1 = _pi()
109     $N1 = $N1 / 2
110     $N0 = cos $N1
111     is($N0, 0.0, "cos(pi/2)", epsilon)
112 .end
114 .sub test_cos_i
115     .param num epsilon
117     $N0 = cos 0
118     is($N0, 1.0, "cos(0)", epsilon)
120     $N0 = cos 1
121     is($N0, 0.540302, "cos(1)", epsilon)
122 .end
124 .sub test_tan_n
125     .param num epsilon
127     $N0 = tan 0.0
128     is($N0, 0.0, "tan(0.0)", epsilon)
130     $N0 = tan 1.0
131     is($N0, 1.557408, "tan(1.0)", epsilon)
132 .end
134 .sub test_tan_i
135     .param num epsilon
137     $N0 = tan 0
138     is($N0, 0.0, "tan(0)", epsilon)
140     $N0 = tan 1
141     is($N0, 1.557408, "tan(1)", epsilon)
142 .end
144 .sub test_cot_n
145     .param num epsilon
147     $N0 = cot 0.5
148     is($N0,  1.8305, "cot(0.5)", epsilon)
150     $N0 = cot 1.0
151     is($N0,  0.64209, "cot(1.0)", epsilon)
152 .end
154 .sub test_cot_i
155     .param num epsilon
157     $N0 = cot 1
158     is($N0, 0.64209, "cot(1)", epsilon)
160     $N0 = cot 2
161     is($N0,  -0.45766, "cot(2)", epsilon)
162 .end
164 .sub test_sec_n
165     .param num epsilon
167     $N1 = 1.0
168     $N2 = sec $N1
169     is($N2, 1.850816, "sec(1.0)", epsilon)
170 .end
172 .sub test_sec_i
173     .param num epsilon
175     $I1 = 1
176     $N1 = sec $I1
177     is($N1, 1.850816, "sec(1)", epsilon)
178 .end
180 .sub test_csc_n
181     .param num epsilon
183     $N0 = csc 0.5
184     is($N0,   2.0858, "csc(0.5)", epsilon)
186     $N0 = csc 1.0
187     is($N0,  1.1884, "csc(1.0)", epsilon)
188 .end
190 .sub test_csc_i
191     .param num epsilon
193     $N0 = csc 1
194     is($N0, 1.1884, "csc(1)", epsilon)
196     $N0 = csc 2
197     is($N0,   1.0998, "csc(2)", epsilon)
198 .end
200 .sub test_atan_n
201     .param num epsilon
203     $N1 = 1.0
204     $N2 = atan $N1
205     is($N2, 0.785398, "atan(1.0)", epsilon)
206 .end
208 .sub test_atan_i
209     .param num epsilon
211     $I1 = 1
212     $N1 = atan $I1
213     is($N1, 0.785398, "atan(1)", epsilon)
214 .end
216 .sub test_asin_n
217     .param num epsilon
218     .local num pi2
219     pi2 = _pi()
220     pi2 /= 2
222     $N1 = 1.0
223     $N2 = asin $N1
224     is($N2, pi2, "asin(1.0)", epsilon)
225 .end
227 .sub test_asin_i
228     .param num epsilon
229     .local num pi2
230     pi2 = _pi()
231     pi2 /= 2
233     $I1 = 1
234     $N1 = asin $I1
235     is($N1, pi2, "asin(1)", epsilon)
236 .end
238 .sub test_acos_n
239     .param num epsilon
241     $N1 = 1.0
242     $N2 = acos $N1
243     is($N2, 0.0, "acos(1.0)", epsilon)
244 .end
246 .sub test_acos_i
247     .param num epsilon
249     $I1 = 1
250     $N1 = acos $I1
251     is($N1, 0.0, "acos(1)", epsilon)
252 .end
254 .sub test_asec_n
255     .param num epsilon
257     $N1 = 1.0
258     $N2 = asec $N1
259     is($N2, 0.0, "asec(1.0)", epsilon)
260 .end
262 .sub test_asec_i
263     .param num epsilon
265     $I1 = 1
266     $N1 = asec $I1
267     is($N1, 0.0, "asec(1)", epsilon)
268 .end
270 .sub test_cosh_n
271     .param num epsilon
272     .local num result
274     $N1 = 1.0
275     $N2 = cosh $N1
276     is($N2, 1.543081, "cosh(1.0)", epsilon)
277 .end
279 .sub test_cosh_i
280     .param num epsilon
282     $I1 = 1
283     $N1 = cosh $I1
284     is($N1, 1.543081, "cosh(1)", epsilon)
285 .end
287 .sub integer_overflow_with_pow
288     .include "iglobals.pasm"
290     # Check that we aren't 32-bit INTVALs without GMP
291     .local pmc interp     # a handle to our interpreter object.
292     interp = getinterp
293     .local pmc config
294     config = interp[.IGLOBALS_CONFIG_HASH]
295     .local int intvalsize
296     intvalsize = config['intvalsize']
297     .local int gmp
298     gmp = config['gmp']
300     if intvalsize != 4 goto can_test
301     if gmp goto can_test
302         skip(40,'No integer overflow for 32-bit INTVALs without GMP installed')
303         goto end
305   can_test:
307     .local pmc i1, i2, r
308     i1 = new 'Integer'
309     i2 = new 'Integer'
310     i1 = 2
311     i2 = 1
312     $I1 = 1
313   next:
314     null r
315     r = pow i1, i2
316     $S0 = r
318     $I1 = $I1 * 2
319     is( $S0, $I1, 'integer_overflow_with_pow' )
321     inc i2
322 # XXX: this must be extended to at least 64 bit range
323 # when sure that the result is not floating point.
324 # In the meantime, make sure it overflows nicely
325 # on 32 bit.
326     unless i2 > 40 goto next
328   end:
329 .end
331 .macro sprintf_is(fmt, number, message)
332     c = .number
333     $S0 = sprintf .fmt, c
334     $S1 = .message
335     is( $S0, $S1, $S1 )
336 .endm
338 .sub e_raised_pi_time_i__plus_1_equal_0
339     .local pmc c, c2, c3
340     c  = new ['Complex']
341     c2 = new ['Complex']
342     c3 = new ['Complex']
343     # e^(pi * i) + 1 = 0
344     $N0 = atan 1
345     $N0 *= 4
346     c[0] = 0.0
347     c[1] = $N0
348     c2 = c.'exp'()
349     c2 += 1.0
350     .sprintf_is( "%.3f%+.3fi", c2, "0.000+0.000i" )
351 .end
353 # Local Variables:
354 #   mode: pir
355 #   fill-column: 100
356 # End:
357 # vim: expandtab shiftwidth=4 ft=pir: