1#!./parrot
2# Copyright (C) 2001-2011, Parrot Foundation.
3
4=head1 NAME
5
6t/op/trans.t - Trancendental Mathematical Ops
7
8=head1 SYNOPSIS
9
10        % prove t/op/trans.t
11
12=head1 DESCRIPTION
13
14Tests various transcendental operations
15
16=cut
17
18.loadlib 'trans_ops'
19
20.sub main :main
21    .include 'test_more.pir'
22    .local num epsilon
23    epsilon = _epsilon()
24
25    plan(111)
26
27    test_sin_n(epsilon)
28    test_sin_i(epsilon)
29    test_cos_n(epsilon)
30    test_cos_i(epsilon)
31    test_tan_n(epsilon)
32    test_tan_i(epsilon)
33    test_cot_n(epsilon)
34    test_cot_i(epsilon)
35    test_sec_n(epsilon)
36    test_sec_i(epsilon)
37    test_csc_n(epsilon)
38    test_csc_i(epsilon)
39    test_atan_n(epsilon)
40    test_atan_i(epsilon)
41    test_asin_n(epsilon)
42    test_asin_i(epsilon)
43    test_acos_n(epsilon)
44    test_acos_i(epsilon)
45    test_asec_n(epsilon)
46    test_asec_i(epsilon)
47    test_sinh_n(epsilon)
48    test_sinh_i(epsilon)
49    test_cosh_n(epsilon)
50    test_cosh_i(epsilon)
51    test_sech_n(epsilon)
52    test_sech_i(epsilon)
53    test_tanh_n(epsilon)
54    test_tanh_i(epsilon)
55    test_exp_n(epsilon)
56    test_ln_n(epsilon)
57    test_log2_n(epsilon)
58    test_log10_n(epsilon)
59    test_pow_p_p_p()
60    test_pow_p_p_i()
61    test_pow_p_p_n()
62    test_pow_n_nc_i(epsilon)
63    integer_overflow_with_pow()
64    e_raised_pi_time_i__plus_1_equal_0()
65.end
66
67.sub _pi
68    .return (3.1415926535897)
69.end
70
71.sub _e
72    .return (2.7182818459045)
73.end
74
75.sub _epsilon
76    .return (0.0001)
77.end
78
79.sub test_sin_n
80    .param num epsilon
81
82    $N0 = sin 0.0
83    is($N0, 0.0, "sin(0.0)", epsilon)
84
85    $N0 = sin 1.0
86    is($N0, 0.841471, "sin(1.0)", epsilon)
87
88    $N1 = _pi()
89    $N0 = sin $N1
90    is($N0, 0.0, "sin(pi)", epsilon)
91
92    $N1 = _pi()
93    $N1 = $N1 / 2
94    $N0 = sin $N1
95    is($N0, 1.0, "sin(pi/2)", epsilon)
96.end
97
98.sub test_sin_i
99    .param num epsilon
100
101    $N0 = sin 0
102    is($N0, 0.0, "sin(0)", epsilon)
103
104    $N0 = sin 1
105    is($N0, 0.841471, "sin(1)", epsilon)
106.end
107
108.sub test_cos_n
109    .param num epsilon
110
111    $N0 = cos 0.0
112    is($N0, 1.0, "cos(0.0)", epsilon)
113
114    $N0 = cos 1.0
115    is($N0, 0.540302, "cos(1.0)", epsilon)
116
117    $N1 = _pi()
118    $N0 = cos $N1
119    is($N0, -1.0, "cos(pi)", epsilon)
120
121    $N1 = _pi()
122    $N1 = $N1 / 2
123    $N0 = cos $N1
124    is($N0, 0.0, "cos(pi/2)", epsilon)
125.end
126
127.sub test_cos_i
128    .param num epsilon
129
130    $N0 = cos 0
131    is($N0, 1.0, "cos(0)", epsilon)
132
133    $N0 = cos 1
134    is($N0, 0.540302, "cos(1)", epsilon)
135.end
136
137.sub test_tan_n
138    .param num epsilon
139
140    $N0 = tan 0.0
141    is($N0, 0.0, "tan(0.0)", epsilon)
142
143    $N0 = tan 1.0
144    is($N0, 1.557408, "tan(1.0)", epsilon)
145.end
146
147.sub test_tan_i
148    .param num epsilon
149
150    $N0 = tan 0
151    is($N0, 0.0, "tan(0)", epsilon)
152
153    $N0 = tan 1
154    is($N0, 1.557408, "tan(1)", epsilon)
155.end
156
157.sub test_cot_n
158    .param num epsilon
159
160    $N0 = cot 0.5
161    is($N0,  1.8305, "cot(0.5)", epsilon)
162
163    $N0 = cot 1.0
164    is($N0,  0.64209, "cot(1.0)", epsilon)
165.end
166
167.sub test_cot_i
168    .param num epsilon
169
170    $N0 = cot 1
171    is($N0, 0.64209, "cot(1)", epsilon)
172
173    $N0 = cot 2
174    is($N0,  -0.45766, "cot(2)", epsilon)
175.end
176
177.sub test_sec_n
178    .param num epsilon
179
180    $N1 = 1.0
181    $N2 = sec $N1
182    is($N2, 1.850816, "sec(1.0)", epsilon)
183
184    $N2 = sec 1.0
185    is($N2, 1.850816, "sec(1.0)", epsilon)
186.end
187
188.sub test_sec_i
189    .param num epsilon
190
191    $I1 = 1
192    $N1 = sec $I1
193    is($N1, 1.850816, "sec(1)", epsilon)
194.end
195
196.sub test_csc_n
197    .param num epsilon
198
199    $N0 = csc 0.5
200    is($N0,   2.0858, "csc(0.5)", epsilon)
201
202    $N0 = csc 1.0
203    is($N0,  1.1884, "csc(1.0)", epsilon)
204.end
205
206.sub test_csc_i
207    .param num epsilon
208
209    $N0 = csc 1
210    is($N0, 1.1884, "csc(1)", epsilon)
211
212    $N0 = csc 2
213    is($N0,   1.0998, "csc(2)", epsilon)
214.end
215
216.sub test_atan_n
217    .param num epsilon
218
219    $N1 = 1.0
220    $N2 = atan $N1
221    is($N2, 0.785398, "atan(1.0)", epsilon)
222.end
223
224.sub test_atan_i
225    .param num epsilon
226
227    $I1 = 1
228    $N1 = atan $I1
229    is($N1, 0.785398, "atan(1)", epsilon)
230.end
231
232.sub test_asin_n
233    .param num epsilon
234    .local num pi2
235    pi2 = _pi()
236    pi2 /= 2
237
238    $N1 = 1.0
239    $N2 = asin $N1
240    is($N2, pi2, "asin(1.0)", epsilon)
241
242    $N2 = asin 1.0
243    is($N2, pi2, "asin(1.0)", epsilon)
244.end
245
246.sub test_asin_i
247    .param num epsilon
248    .local num pi2
249    pi2 = _pi()
250    pi2 /= 2
251
252    $I1 = 1
253    $N1 = asin $I1
254    is($N1, pi2, "asin(1)", epsilon)
255.end
256
257.sub test_acos_n
258    .param num epsilon
259
260    $N1 = 1.0
261    $N2 = acos $N1
262    is($N2, 0.0, "acos(1.0)", epsilon)
263
264    $N2 = acos 1.0
265    is($N2, 0.0, "acos(1.0)", epsilon)
266.end
267
268.sub test_acos_i
269    .param num epsilon
270
271    $I1 = 1
272    $N1 = acos $I1
273    is($N1, 0.0, "acos(1)", epsilon)
274.end
275
276.sub test_asec_n
277    .param num epsilon
278
279    $N1 = 1.0
280    $N2 = asec $N1
281    is($N2, 0.0, "asec(1.0)", epsilon)
282
283    $N2 = asec 1.0
284    is($N2, 0.0, "asec(1.0)", epsilon)
285.end
286
287.sub test_asec_i
288    .param num epsilon
289
290    $I1 = 1
291    $N1 = asec $I1
292    is($N1, 0.0, "asec(1)", epsilon)
293.end
294
295.sub test_sinh_n
296    .param num epsilon
297    .local num result
298
299    $N1 = 1.0
300    $N2 = sinh $N1
301    is($N2, 1.175201, "sinh(1.0)", epsilon)
302
303    $N2 = sinh 1.0
304    is($N2, 1.175201, "sinh(1.0)", epsilon)
305.end
306
307.sub test_sinh_i
308    .param num epsilon
309
310    $I1 = 1
311    $N1 = sinh $I1
312    is($N1, 1.175201, "sinh(1)", epsilon)
313.end
314
315.sub test_cosh_n
316    .param num epsilon
317    .local num result
318
319    $N1 = 1.0
320    $N2 = cosh $N1
321    is($N2, 1.543081, "cosh(1.0)", epsilon)
322
323    $N2 = cosh 1.0
324    is($N2, 1.543081, "cosh(1.0)", epsilon)
325.end
326
327.sub test_cosh_i
328    .param num epsilon
329
330    $I1 = 1
331    $N1 = cosh $I1
332    is($N1, 1.543081, "cosh(1)", epsilon)
333.end
334
335.sub test_sech_n
336    .param num epsilon
337    .local num result
338
339    $N1 = 1.0
340    $N2 = sech $N1
341    is($N2, 0.648054, "sech(1.0)", epsilon)
342
343    $N2 = sech 1.0
344    is($N2, 0.648054, "sech(1.0)", epsilon)
345.end
346
347.sub test_sech_i
348    .param num epsilon
349
350    $I1 = 1
351    $N1 = sech $I1
352    is($N1, 0.648054, "sech(1)", epsilon)
353.end
354
355.sub test_tanh_n
356    .param num epsilon
357    .local num result
358
359    $N1 = 1.0
360    $N2 = tanh $N1
361    is($N2, 0.761594, "tanh(1.0)", epsilon)
362
363    $N2 = tanh 1.0
364    is($N2, 0.761594, "tanh(1.0)", epsilon)
365.end
366
367.sub test_tanh_i
368    .param num epsilon
369
370    $I1 = 1
371    $N1 = tanh $I1
372    is($N1, 0.761594, "tanh(1)", epsilon)
373.end
374
375.sub test_exp_n
376    .param num epsilon
377    .local num result
378
379    $N1 = 2.0
380    $N2 = exp $N1
381    is($N2, 7.389056, "exp(2.0)", epsilon)
382
383    $N2 = exp 2.0
384    is($N2, 7.389056, "exp(2.0)", epsilon)
385.end
386
387.sub test_ln_n
388    .param num epsilon
389    .local num result
390
391    $N1 = 2.0
392    $N2 = ln $N1
393    is($N2, 0.693147, "ln(2.0)", epsilon)
394
395    $N2 = ln 2.0
396    is($N2, 0.693147, "ln(2.0)", epsilon)
397.end
398
399.sub test_log2_n
400    .param num epsilon
401    .local num result
402
403    $N1 = 16.0
404    $N2 = log2 $N1
405    is($N2, 4.0, "ln(2.0)", epsilon)
406
407    $N2 = log2 16.0
408    is($N2, 4.0, "ln(2.0)", epsilon)
409.end
410
411.sub test_log10_n
412    .param num epsilon
413    .local num result
414
415    $N1 = 100.0
416    $N2 = log10 $N1
417    is($N2, 2.0, "log10(100.0)", epsilon)
418
419    $N2 = log10 100.0
420    is($N2, 2.0, "log10(100.0)", epsilon)
421.end
422
423.sub test_pow_p_p_p
424    $P1 = new ['Integer']
425    $P1 = 2
426    $P2 = new ['Integer']
427    $P2 = 2
428    null $P3
429    $P3 = pow $P1, $P2
430    is($P3, 4, "pow(2, 2) with null register")
431
432    $P3 = pow $P1, $P2
433    is($P3, 4, "pow(2, 2)")
434.end
435
436.sub test_pow_p_p_i
437    $P1 = new ['Integer']
438    $P1 = 2
439    null $P2
440    $P2 = pow $P1, 2
441    is($P2, 4, "pow(2, const 2) with null register")
442
443    $P2 = pow $P1, 2
444    is($P2, 4, "pow(2, const 2)")
445
446    $I1 = 2
447    null $P2
448    $P2 = pow $P1, $I1
449    is($P2, 4, "pow(2, 2) with null register")
450
451    $P2 = pow $P1, $I1
452    is($P2, 4, "pow(2, 2)")
453.end
454
455.sub test_pow_p_p_n
456    $P1 = new ['Integer']
457    $P1 = 2
458    null $P2
459    $P2 = pow $P1, 2.0
460    is($P2, 4, "pow(2, const 2.0) with null register")
461
462    $P2 = pow $P1, 2.0
463    is($P2, 4, "pow(2, const 2.0)")
464
465    $N1 = 2.0
466    null $P2
467    $P2 = pow $P1, $N1
468    is($P2, 4, "pow(2, 2.0) with null register")
469
470    $P2 = pow $P1, $N1
471    is($P2, 4, "pow(2, 2.0)")
472.end
473
474.sub test_pow_n_nc_i
475   .param num epsilon
476
477   $I1 = 2
478   $N0 = pow 2.0, $I1
479   is($N0, 4, "pow(2, 2)")
480
481   $I1 = -2
482   $N0 = pow 2.0, $I1
483   is($N0, 0.25, "pow(2, -2)", epsilon)
484.end
485
486.sub integer_overflow_with_pow
487    .include "iglobals.pasm"
488
489    # Check that we aren't 32-bit INTVALs without GMP
490    .local pmc interp     # a handle to our interpreter object.
491    interp = getinterp
492    .local pmc config
493    config = interp[.IGLOBALS_CONFIG_HASH]
494    .local int intvalsize
495    intvalsize = config['intvalsize']
496    .local string gmp
497    gmp = config['gmp']
498
499    if intvalsize == 4 goto skipthem
500
501    if gmp == 'define' goto can_test
502
503    goto skipthem
504
505  can_test:
506
507    .local pmc i1, i2, r
508    i1 = new 'Integer'
509    i2 = new 'Integer'
510    i1 = 2
511    i2 = 1
512    $I1 = 1
513  next:
514    null r
515    r = pow i1, i2
516    $S0 = r
517
518    $I1 = $I1 * 2
519    is( $S0, $I1, 'integer_overflow_with_pow' )
520
521    inc i2
522# XXX: this must be extended to at least 64 bit range
523# when sure that the result is not floating point.
524# In the meantime, make sure it overflows nicely
525# on 32 bit.
526    unless i2 > 40 goto next
527    goto end
528
529  skipthem:
530    skip(40,'No integer overflow tests for 32-bit INTVALs')
531  end:
532.end
533
534.macro sprintf_is(fmt, number, message)
535    c = .number
536    $S0 = sprintf .fmt, c
537    $S1 = .message
538    is( $S0, $S1, $S1 )
539.endm
540
541.sub e_raised_pi_time_i__plus_1_equal_0
542    .local pmc c, c2, c3
543    c  = new ['Complex']
544    c2 = new ['Complex']
545    c3 = new ['Complex']
546    # e^(pi * i) + 1 = 0
547    $N0 = atan 1
548    $N0 *= 4
549    c[0] = 0.0
550    c[1] = $N0
551    c2 = c.'exp'()
552    c2 += 1.0
553    .sprintf_is( "%.3f%+.3fi", c2, "0.000+0.000i" )
554.end
555
556# Local Variables:
557#   mode: pir
558#   fill-column: 100
559# End:
560# vim: expandtab shiftwidth=4 ft=pir:
561
562