* examples/pasm/fact.pasm:
[parrot.git] / t / op / trans.t
blob64b152c5c3a324d9cd75808848e12c19777e9ca3
1 #!perl
2 # Copyright (C) 2001-2005, The Perl Foundation.
3 # $Id$
5 use strict;
6 use warnings;
7 use lib qw( . lib ../lib ../../lib );
8 use Test::More;
9 use Parrot::Test tests => 22;
10 use Math::Trig qw( tan sec atan asin acos asec cosh sinh tanh sech );
12 =head1 NAME
14 t/op/trans.t - Transcendental Mathematical Ops
16 =head1 SYNOPSIS
18         % prove t/op/trans.t
20 =head1 DESCRIPTION
22 Tests the transcendental mathematical operations.
24 =cut
26 # This defines two macros:
27 # fp_eq N, N, LABEL
28 # fp_ne N, N, LABEL
29 # which will conditionally branch
30 # to LABEL if abs(n,n) < epsilon
32 my $fp_equality_macro = <<'ENDOFMACRO';
33 .macro fp_eq(J,K,L)
34         save    N0
35         save    N1
36         save    N2
38         set     N0, .J
39         set     N1, .K
40         sub     N2, N1,N0
41         abs     N2, N2
42         gt      N2, 0.000001, .$FPEQNOK
44         restore N2
45         restore N1
46         restore N0
47         branch  .L
48 .label $FPEQNOK:
49         restore N2
50         restore N1
51         restore N0
52 .endm
53 .macro fp_ne ( J,K,L )
54         save    N0
55         save    N1
56         save    N2
58         set     N0, .J
59         set     N1, .K
60         sub     N2, N1,N0
61         abs     N2, N2
62         lt      N2, 0.000001, $FPNENOK
64         restore N2
65         restore N1
66         restore N0
67         branch  .L
68 .label $FPNENOK:
69         restore N2
70         restore N1
71         restore N0
72 .endm
73 ENDOFMACRO
75 pasm_output_is( <<"CODE", <<OUTPUT, "sin" );
76 @{[ $fp_equality_macro ]}
77         set     N1, 1.0
78         sin     N2, N1
79         .fp_eq  (N2, 0.841471, EQ1)
80         print   "not "
81 EQ1:    print   "ok 1\\n"
83         set     I1, 1
84         sin     N2, I1
85         .fp_eq  (N2, 0.841471, EQ2)
86         print   "not "
87 EQ2:    print   "ok 2\\n"
89         end
90 CODE
91 ok 1
92 ok 2
93 OUTPUT
95 pasm_output_is( <<"CODE", <<OUTPUT, "cos" );
96 @{[ $fp_equality_macro ]}
97         set     N1, 1.0
98         cos     N2, N1
99         .fp_eq  (N2, 0.540302, EQ1)
100         print   "not "
101 EQ1:    print   "ok 1\\n"
103         set     I1, 1
104         cos     N2, I1
105         .fp_eq  (N2, 0.540302, EQ2)
106         print   "not "
107 EQ2:    print   "ok 2\\n"
108         end
109 CODE
110 ok 1
111 ok 2
112 OUTPUT
114 pasm_output_is( <<"CODE", <<OUTPUT, "tan" );
115 @{[ $fp_equality_macro ]}
116         set     N1, 1.0
117         tan     N2, N1
118         .fp_eq  (N2, 1.557408, EQ1)
119         print   "not "
120 EQ1:    print   "ok 1\\n"
122         set     I1, 1
123         tan     N2, I1
124         .fp_eq  (N2, 1.557408, EQ2)
125         print   "not "
126 EQ2:    print   "ok 2\\n"
127         end
128 CODE
129 ok 1
130 ok 2
131 OUTPUT
133 pasm_output_is( <<"CODE", <<OUTPUT, "sec" );
134 @{[ $fp_equality_macro ]}
135         set N1, 1.0
136         sec N2, N1
137         .fp_eq  (N2, 1.850816, EQ1)
138         print "not "
139 EQ1:    print "ok 1\\n"
141         set I1, 1
142         sec N2, I1
143         .fp_eq  (N2, 1.850816, EQ2)
144         print "not "
145 EQ2:    print "ok 2\\n"
146         end
147 CODE
148 ok 1
149 ok 2
150 OUTPUT
152 pasm_output_is( <<"CODE", <<OUTPUT, "atan" );
153 @{[ $fp_equality_macro ]}
154         set N1, 1.0
155         atan N2, N1
156         .fp_eq  (N2, 0.785398, EQ1)
157         print "not "
158 EQ1:    print "ok 1\\n"
160         set I1, 1
161         atan N2, I1
162         .fp_eq  (N2,0.785398 , EQ2)
163         print "not "
164 EQ2:    print "ok 2\\n"
165         end
166 CODE
167 ok 1
168 ok 2
169 OUTPUT
171 pasm_output_is( <<"CODE", <<OUTPUT, "asin" );
172 @{[ $fp_equality_macro ]}
173         set N1, 1.0
174         asin N2, N1
175         .fp_eq  (N2, 1.570796, EQ1)
176         print "not "
177 EQ1:    print "ok 1\\n"
179         set I1, 1
180         asin N2, I1
181         .fp_eq  (N2, 1.570796 , EQ2)
182         print "not "
183 EQ2:    print "ok 2\\n"
185         end
186 CODE
187 ok 1
188 ok 2
189 OUTPUT
191 pasm_output_is( <<"CODE", <<OUTPUT, "acos" );
192 @{[ $fp_equality_macro ]}
193         set N1, 1.0
194         acos N2, N1
195         .fp_eq  (N2, 0.000000, EQ1)
196         print "not "
197 EQ1:    print "ok 1\\n"
199         set I1, 1
200         acos N2, I1
201         .fp_eq  (N2, 0.000000, EQ2)
202         print "not "
203 EQ2:    print "ok 2\\n"
205         end
206 CODE
207 ok 1
208 ok 2
209 OUTPUT
211 pasm_output_is( <<"CODE", <<OUTPUT, "asec" );
212 @{[ $fp_equality_macro ]}
213         set N1, 1.0
214         asec N2, N1
215         .fp_eq  (N2, 0.000000, EQ1)
216         print "not "
217 EQ1:    print "ok 1\\n"
219         set I1, 1
220         asec N2, I1
221         .fp_eq  (N2, 0.000000, EQ2)
222         print "not "
223 EQ2:    print "ok 2\\n"
225         end
226 CODE
227 ok 1
228 ok 2
229 OUTPUT
231 pasm_output_is( <<"CODE", <<OUTPUT, "cosh" );
232 @{[ $fp_equality_macro ]}
233         set N1, 1.0
234         cosh N2, N1
235         .fp_eq  (N2, 1.543081, EQ1)
236         print "not "
237 EQ1:    print "ok 1\\n"
239         set I1, 1
240         cosh N2, I1
241         .fp_eq  (N2, 1.543081, EQ2)
242         print "not "
243 EQ2:    print "ok 2\\n"
245         end
246 CODE
247 ok 1
248 ok 2
249 OUTPUT
251 pasm_output_is( <<"CODE", <<OUTPUT, "sinh" );
252 @{[ $fp_equality_macro ]}
253         set N1, 1.0
254         sinh N2, N1
255         .fp_eq  (N2, 1.175201, EQ1)
256         print "not "
257 EQ1:    print "ok 1\\n"
259         set I1, 1
260         sinh N2, I1
261         .fp_eq  (N2, 1.175201, EQ2)
262         print "not "
263 EQ2:    print "ok 2\\n"
265         end
266 CODE
267 ok 1
268 ok 2
269 OUTPUT
271 pasm_output_is( <<"CODE", <<OUTPUT, "tanh" );
272 @{[ $fp_equality_macro ]}
273         set N1, 1.0
274         tanh N2, N1
275         .fp_eq  (N2, 0.761594, EQ1)
276         print "not "
277 EQ1:    print "ok 1\\n"
279         set I1, 1
280         tanh N2, I1
281         .fp_eq  (N2, 0.761594, EQ2)
282         print "not "
283 EQ2:    print "ok 2\\n"
285         end
286 CODE
287 ok 1
288 ok 2
289 OUTPUT
291 pasm_output_is( <<"CODE", <<OUTPUT, "sech" );
292 @{[ $fp_equality_macro ]}
293         set N1, 1.0
294         sech N2, N1
295         .fp_eq  (N2, 0.648054, EQ1)
296         print "not "
297 EQ1:    print "ok 1\\n"
299         set I1, 1
300         sech N2, I1
301         .fp_eq  (N2, 0.648054, EQ2)
302         print "not "
303 EQ2:    print "ok 2\\n"
305         end
306 CODE
307 ok 1
308 ok 2
309 OUTPUT
311 pasm_output_is( <<"CODE", <<OUTPUT, "atan2" );
312 @{[ $fp_equality_macro]}
313         set N0, 0.0
314         set I0, 0
315         set N1, 1.0
316         set I1, 1
317         set N2, 1.0
318         set I2, 1
319         set I3, -1
320         set N3, -1.0
322         atan N4, N1, N2
323         .fp_eq  (N4, 0.785398, EQ1)
324         print "not "
325 EQ1:    print "ok 1\\n"
327         atan N4, N1, I2
328         .fp_eq  (N4, 0.785398, EQ2)
329         print "not "
330 EQ2:    print "ok 2\\n"
332         atan N4, I1, N2
333         .fp_eq  (N4, 0.785398, EQ3)
334         print "not "
335 EQ3:    print "ok 3\\n"
337         atan N4, I1, I2
338         .fp_eq  (N4, 0.785398, EQ4)
339         print "not "
340 EQ4:    print "ok 4\\n"
342         atan N4, N3, 1.0
343         .fp_eq   (N4, -0.785398, EQ5)
344         print "not "
345 EQ5:    print "ok 5\\n"
347         atan N4, N1, 0
348         .fp_eq   (N4, 1.570796, EQ6)
349         print "not "
350 EQ6:    print "ok 6\\n"
352         atan N4, I3, 0.0
353         .fp_eq   (N4, -1.570796, EQ7)
354         print "not "
355 EQ7:    print "ok 7\\n"
357         atan N4, I3, -1
358         .fp_eq   (N4, -2.356194, EQ8)
359         print "not "
360 EQ8:    print "ok 8\\n"
362         atan N4, 1.0, N3
363         .fp_eq   (N4, 2.356194, EQ9)
364         print "not "
365 EQ9:    print "ok 9\\n"
367         atan N4, 1.0, I0
368         .fp_eq   (N4, 1.570796, EQ10)
369         print "not "
370 EQ10:   print "ok 10\\n"
372         atan N4, 1, N1
373         .fp_eq   (N4, 0.785398, EQ11)
374         print "not "
375 EQ11:   print "ok 11\\n"
377         atan N4, 1, I1
378         .fp_eq   (N4, 0.785398, EQ12)
379         print "not "
380 EQ12:   print "ok 12\\n"
382         atan N4, 0.0, 1.0
383         .fp_eq   (N4, 0.000000, EQ13)
384         print "not "
385 EQ13:   print "ok 13\\n"
387         atan N4, -1.0, 0
388         .fp_eq   (N4, -1.570796, EQ14)
389         print "not "
390 EQ14:   print "ok 14\\n"
392         atan N4, 1, -1.0
393         .fp_eq   (N4, 2.356194, EQ15)
394         print "not "
395 EQ15:   print "ok 15\\n"
397         atan N4, 0, 1
398         .fp_eq   (N4, 0.000000, EQ16)
399         print "not "
400 EQ16:   print "ok 16\\n"
401         end
402 CODE
403 ok 1
404 ok 2
405 ok 3
406 ok 4
407 ok 5
408 ok 6
409 ok 7
410 ok 8
411 ok 9
412 ok 10
413 ok 11
414 ok 12
415 ok 13
416 ok 14
417 ok 15
418 ok 16
419 OUTPUT
421 pasm_output_is( <<"CODE", <<'OUTPUT', 'atan, part 2' );
422 @{[ $fp_equality_macro ]}
423         atan N4, -0.0, -0.0
424         .fp_eq   (N4, -3.1415926, EQ1)
425         print "not "
426         print N4
427 EQ1:    print "ok 1\\n"
428         end
429 CODE
430 ok 1
431 OUTPUT
433 pasm_output_is( <<"CODE", <<OUTPUT, "log2" );
434 @{[ $fp_equality_macro ]}
435         set N1, 10.0
436         log2 N2, N1
437         .fp_eq  (N2, 3.321928, EQ1)
438         print "not "
439 EQ1:    print "ok 1\\n"
441         set I1, 10
442         log2 N2, I1
443         .fp_eq  (N2, 3.321928, EQ2)
444         print "not "
445 EQ2:    print "ok 2\\n"
447         end
448 CODE
449 ok 1
450 ok 2
451 OUTPUT
453 pasm_output_is( <<"CODE", <<OUTPUT, "log10" );
454 @{[ $fp_equality_macro ]}
455         set N1, 15.0
456         log10 N2, N1
457         .fp_eq  (N2, 1.176091, EQ1)
458         print "not "
459 EQ1:    print "ok 1\\n"
461         set I1, 15
462         log10 N2, I1
463         .fp_eq  (N2, 1.176091, EQ2)
464         print "not "
465 EQ2:    print "ok 2\\n"
467         end
468 CODE
469 ok 1
470 ok 2
471 OUTPUT
473 pasm_output_is( <<"CODE", <<OUTPUT, "ln" );
474 @{[ $fp_equality_macro ]}
475         set N1, 10.0
476         ln N2, N1
477         .fp_eq  (N2, 2.302585, EQ1)
478         print "not "
479 EQ1:    print "ok 1\\n"
481         set I1, 10
482         ln N2, I1
483         .fp_eq  (N2, 2.302585, EQ2)
484         print "not "
485 EQ2:    print "ok 2\\n"
486         end
487 CODE
488 ok 1
489 ok 2
490 OUTPUT
492 pasm_output_is( <<"CODE", <<OUTPUT, "exp" );
493 @{[ $fp_equality_macro ]}
494         set N1, 10.0
495         exp N2, N1
496         .fp_eq  (N2, 22026.465795, EQ1)
497         print "not "
498 EQ1:    print "ok 1\\n"
500         set I1, 10
501         exp N2, I1
502         .fp_eq (N2, 22026.465795, EQ2)
503         print "not "
504 EQ2:    print "ok 2\\n"
505         end
506 CODE
507 ok 1
508 ok 2
509 OUTPUT
511 pasm_output_is( <<"CODE", <<OUTPUT, "pow" );
512 @{[ $fp_equality_macro ]}
513         set N1, 3.0
514         set I1, 3
515         set N2, 5.0
516         set I2, 5
517         pow N3, N1, N2
518         .fp_eq  (N3, 243.0, EQ1)
519         print "not "
520 EQ1:    print "ok 1\\n"
522         pow N3, N1, I2
523         .fp_eq  (N3, 243.0, EQ2)
524         print "not "
525 EQ2:    print "ok 2\\n"
527         pow N3, I1, N2
528         .fp_eq  (N3, 243.0, EQ3)
529         print "not "
530 EQ3:    print "ok 3\\n"
532         pow N3, I1, I2
533         .fp_eq  (N3, 243.0, EQ4)
534         print "not "
535 EQ4:    print "ok 4\\n"
537         set N0, 0.0
538         set I0, 0
539         set N1, 1.0
540         set I1, 1
541         set N2, 4.0
542         set I2, 4
543         pow N3, N2, 2.5
544         .fp_eq  (N3, 32.0, EQ5)
545         print "not "
546 EQ5:    print "ok 5\\n"
548         pow N3, N2, -2
549         .fp_eq  (N3, 0.0625, EQ6)
550         print "not "
551 EQ6:    print "ok 6\\n"
553         pow N3, I2, 0.5
554         .fp_eq  (N3, 2.0, EQ7)
555         print "not "
556 EQ7:    print "ok 7\\n"
558         pow N3, I2, 0
559         .fp_eq  (N3, 1.0, EQ8)
560         print "not "
561 EQ8:    print "ok 8\\n"
563         pow N3, 0.0, N2
564         .fp_eq  (N3, 0.0, EQ9)
565         print "not "
566 EQ9:    print "ok 9\\n"
568         pow N3, 2.5, 0.0
569         .fp_eq  (N3, 1.0, EQ10)
570         print "not "
571 EQ10:   print "ok 10\\n"
573         pow N3, 2.5, I2
574         .fp_eq  (N3, 39.0625, EQ11)
575         print "not "
576 EQ11:   print "ok 11\\n"
578         pow N3, 2.0, -4
579         .fp_eq  (N3, 0.0625, EQ12)
580         print "not "
581 EQ12:   print "ok 12\\n"
583         pow N3, 0, N2
584         .fp_eq  (N3, 0.0, EQ13)
585         print "not "
586 EQ13:   print "ok 13\\n"
588         pow N3, 4, -0.5
589         .fp_eq  (N3, 0.5, EQ14)
590         print "not "
591 EQ14:   print "ok 14\\n"
593         pow N3, 4, I2
594         .fp_eq  (N3, 256.0, EQ15)
595         print "not "
596 EQ15:   print "ok 15\\n"
598         pow N3, 4, -1
599         .fp_eq  (N3, 0.25, EQ16)
600         print "not "
601 EQ16:   print "ok 16\\n"
602         end
603 CODE
604 ok 1
605 ok 2
606 ok 3
607 ok 4
608 ok 5
609 ok 6
610 ok 7
611 ok 8
612 ok 9
613 ok 10
614 ok 11
615 ok 12
616 ok 13
617 ok 14
618 ok 15
619 ok 16
620 OUTPUT
622 pasm_output_is( <<"CODE", <<OUTPUT, "sqrt" );
623 @{[ $fp_equality_macro ]}
624        set N1, 9.0
625        sqrt N2, N1
626        .fp_eq  (N2, 3.0, EQ1)
627        print "not "
628 EQ1:   print "ok 1\\n"
630        set I1, 9
631        sqrt N2, I1
632        .fp_eq  (N2, 3.0, EQ2)
633        print "not "
634 EQ2:   print "ok 2\\n"
636        end
637 CODE
638 ok 1
639 ok 2
640 OUTPUT
642 pasm_output_is( <<'CODE', <<OUTPUT, "pow_n_n_ic" );
643     set N0, 2.0
644     pow N1, N0, 0
645     print N1
646     print "\n"
647     pow N1, N0, 1
648     print N1
649     print "\n"
650     pow N1, N0, 2
651     print N1
652     print "\n"
653     pow N1, N0, 3
654     print N1
655     print "\n"
656     pow N1, N0, 4
657     print N1
658     print "\n"
659     pow N1, N0, 5
660     print N1
661     print "\n"
662     pow N1, N0, 6
663     print N1
664     print "\n"
665     pow N1, N0, 7
666     print N1
667     print "\n"
668     pow N1, N0, -1
669     print N1
670     print "\n"
671     pow N1, N0, -2
672     print N1
673     print "\n"
674     pow N1, N0, -3
675     print N1
676     print "\n"
677     pow N1, N0, -4
678     print N1
679     print "\n"
680     pow N1, N0, -5
681     end
682 CODE
683 1.000000
684 2.000000
685 4.000000
686 8.000000
687 16.000000
688 32.000000
689 64.000000
690 128.000000
691 0.500000
692 0.250000
693 0.125000
694 0.062500
695 OUTPUT
697 pasm_output_is( <<'CODE', <<OUTPUT, "pow_n_n_i" );
698     set N0, 2.0
699     set I0, 0
700     pow N1, N0, I0
701     print N1
702     print "\n"
703     inc I0
704     pow N1, N0, I0
705     print N1
706     print "\n"
707     inc I0
708     pow N1, N0, I0
709     print N1
710     print "\n"
711     inc I0
712     pow N1, N0, I0
713     print N1
714     print "\n"
715     inc I0
716     pow N1, N0, I0
717     print N1
718     print "\n"
719     inc I0
720     pow N1, N0, I0
721     print N1
722     print "\n"
723     inc I0
724     pow N1, N0, I0
725     print N1
726     print "\n"
727     set I0, -1
728     pow N1, N0, I0
729     print N1
730     print "\n"
731     dec I0
732     pow N1, N0, I0
733     print N1
734     print "\n"
735     dec I0
736     pow N1, N0, I0
737     print N1
738     print "\n"
739     dec I0
740     pow N1, N0, I0
741     print N1
742     print "\n"
743     dec I0
744     pow N1, N0, I0
745     print N1
746     print "\n"
747     dec I0
748     pow N1, N0, I0
749     print N1
750     print "\n"
751     end
752 CODE
753 1.000000
754 2.000000
755 4.000000
756 8.000000
757 16.000000
758 32.000000
759 64.000000
760 0.500000
761 0.250000
762 0.125000
763 0.062500
764 0.031250
765 0.015625
766 OUTPUT
768 # Local Variables:
769 #   mode: cperl
770 #   cperl-indent-level: 4
771 #   fill-column: 100
772 # End:
773 # vim: expandtab shiftwidth=4: