fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / float.t
blob07bbd26ca7218fb13647cc19276483d36d830504
1 #!./parrot
2 # Copyright (C) 2001-2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/float.t - Floating-point Numbers
9 =head1 SYNOPSIS
11     % prove t/pmc/float.t
13 =head1 DESCRIPTION
15 Tests the Float PMC.
17 =cut
19 .const int TESTS = 166
20 .const num PRECISION = 0.000001
22 .sub 'test' :main
23     .include 'test_more.pir'
25     plan(TESTS)
26     basic_assignment()
27     add_number_to_self()
28     sub_number_from_self()
29     multiply_number_by_self()
30     divide_number_by_self()
31     divide_by_zero()
32     truth_positive_float()
33     truth_negative_float()
34     truth_positive_integer()
35     truth_negative_integer()
36     falseness_0()
37     'falseness_0.000'()
38     integer_addition()
39     integer_substraction()
40     integer_multiplication()
41     integer_division()
42     number_addition()
43     number_substraction()
44     number_multiplication()
45     number_division()
46     increment_decrement()
47     'neg'()
48     negative_zero()
49     equality()
50     is_interface_done()
51     'abs'()
52     'lt'()
53     'lt_num'()
54     'le'()
55     'le_num'()
56     'gt'()
57     'gt_num'()
58     'ge'()
59     'ge_num'()
60     cmp_p_n()
61     'isgt'()
62     'isge'()
63     'islt'()
64     'isle'()
65     'iseq'()
66     'isne'()
67     instantiate_str()
68     cmp_subclasses()
69     acos_method()
70     cos_method()
71     asec_method()
72     asin_method()
73     atan_method()
74     atan2_method()
75     cosh_method()
76     exp_method()
77     ln_method()
78     log10_method()
79     log2_method()
80     sec_method()
81     csc_method()
82     sech_method()
83     sin_method()
84     sinh_method()
85     tan_method()
86     cot_method()
87     tanh_method()
88     sqrt_method()
89 .end
91 .include 'fp_equality.pasm'
93 .sub 'basic_assignment'
94     # Assignments can morph to other PMC type,
95     # use a new Float for each test to be sure we are testing
96     # the intended code.
98     $P0 = new ['Float']
99     $P0 = 0.001
100     is($P0, 0.001, 'basic float assignment 1', PRECISION)
102     $P0 = new ['Float']
103     $P0 = 12.5
104     is($P0, 12.5, 'basic assignment 2', PRECISION)
106     $P0 = new ['Float']
107     $P0 = 1000
108     is($P0, 1000.0, 'basic integer assignment', PRECISION)
110     $P0 = new ['Float']
111     $P0 = 'Twelve point five'
112     is($P0, 0.0, 'basic string assignment', PRECISION)
114     $P0 = new ['Float']
115     $P0 = 123.45
116     $I0 = $P0
117     is($I0, 123, 'rounding to integer')
119     $P0 = new ['Float']
120     $P0 = 123.45
121     $N0 = $P0
122     is($N0, 123.45, 'get_float_value', PRECISION)
124     $P0 = new ['Float']
125     $P0 = 123.45
126     $S0 = $P0
127     is($S0, '123.45', 'get string')
129     $P0 = new ['Float']
130     $P0 = 123.45
131     $S0 = get_repr $P0
132     is($S0, '123.45', 'get_repr')
134     $P0 = new ['Float']
135     $P0 = "12.49"
136     is($P0, 12.49, 'setting value from String', PRECISION)
137 .end
139 .sub 'add_number_to_self'
140     $P0 = new ['Float']
141     $P0 = 0.001
142     $P0 = $P0 + $P0
144     is($P0, 0.002, 'add number to self', PRECISION)
145 .end
147 .sub 'sub_number_from_self'
148     $P0 = new ['Float']
149     $P0 = -1000.2
150     $P0 = $P0 - $P0
152     is($P0, 0.0, 'sub number from self', PRECISION)
153 .end
155 .sub 'multiply_number_by_self'
156     $P0 = new ['Float']
157     $P0 = 123.4
158     $P0 = $P0 * $P0
160     is($P0, 15227.56, 'multiply number by self', PRECISION)
161 .end
163 .sub 'divide_number_by_self'
164     $P0 = new ['Float']
165     $P0 = 1829354.988
166     $P0 = $P0 / $P0
168     is($P0, 1.0, 'divide number by self', PRECISION)
169 .end
171 .sub 'divide_by_zero'
172     $P0 = new ['Float']
173     $P0 = 12.0
175     $P1 = new ['Float']
177     $P2 = new ['Float']
178     $P2 = 0.0
180     push_eh divide_by_zero_handler
181     $P1 = $P0 / $P2
182     pop_eh
183     nok(1, 'divide by zero')
184     .return ()
186   divide_by_zero_handler:
187     ok(1, "divide by zero throws exception")
188 .end
190 .sub 'truth_positive_float'
191     .local pmc float_1
192     float_1 = new ['Float']
193     float_1 = 123.123
194     ok(float_1, 'Truth of a positive float')
195 .end
197 .sub 'truth_negative_float'
198     .local pmc float_1
199     float_1 = new ['Float']
200     float_1 = -123.123
201     ok(float_1, 'Truth of a negative float')
202 .end
204 .sub 'truth_positive_integer'
205     .local pmc float_1
206     float_1 = new ['Float']
207     float_1 = 1
208     ok(float_1, 'Truth of a positive integer')
209 .end
211 .sub 'truth_negative_integer'
212     .local pmc float_1
213     float_1 = new ['Float']
214     float_1 = -1
215     ok(float_1, 'Truth of a negative integer')
216 .end
218 .sub 'falseness_0'
219     .local pmc float_1
220     float_1 = new ['Float']
221     float_1 = 0
222     nok(float_1, 'Falseness of 0')
223 .end
225 .sub 'falseness_0.000'
226     .local pmc float_1
227     float_1 = new ['Float']
228     float_1 = 0.000
229     nok(float_1, 'Falseness of 0.000')
230 .end
232 .sub 'integer_addition'
233     $P0 = new ['Float']
235     $P0 = 0.001
236     $P0 += 1
237     is($P0, 1.001, 'Basic integer arithmetic: addition (1)', PRECISION)
239     $P0 += -2
240     is($P0, -0.999, 'Basic integer arithmetic: addition (2)', PRECISION)
241 .end
243 .sub 'integer_substraction'
244     $P0 = new ['Float']
246     $P0 = 103.45
247     $P0 -= 77
248     is($P0, 26.45, 'Basic integer arithmetic: subtraction (1)', PRECISION)
250     $P0 -= -24
251     is($P0, 50.45, 'Basic integer arithmetic: subtraction (2)', PRECISION)
252 .end
254 .sub 'integer_multiplication'
255     $P0 = new ['Float']
257     $P0 = 0.001
258     $P0 *= 10000
259     is($P0, 10.0, 'Basic integer arithmetic: multiplication (1)', PRECISION)
261     $P0 *= -1
262     is($P0, -10.0, 'Basic integer arithmetic: multiplication (2)', PRECISION)
264     $P0 *= 0
265     is($P0, 0.0, 'Basic integer arithmetic: multiplication (3)', PRECISION)
266 .end
268 .sub 'integer_division'
269     $P0 = new ['Float']
271     $P0 = 1e8
272     $P0 /= 10000
273     is($P0, 10000.0, 'Basic integer arithmetic: division (1)', PRECISION)
275     $P0 /= 1000000
276     is($P0, 0.01, 'Basic integer arithmetic: division (2)', PRECISION)
277 .end
279 .sub 'number_addition'
280     $P0 = new ['Float']
282     $P0 = 0.001
283     $P0 += 1.2
284     is($P0, 1.201, 'Basic numeric arithmetic: addition (1)', PRECISION)
286     $P0 += -2.4
287     is($P0, -1.199, 'Basic numeric arithmetic: addition (2)', PRECISION)
288 .end
290 .sub 'number_substraction'
291     $P0 = new ['Float']
293     $P0 = 103.45
294     $P0 -= 3.46
295     is($P0, 99.99, 'Basic numeric arithmetic: subtraction (1)', PRECISION)
297     $P0 -= -0.01
298     is($P0, 100.0, 'Basic numeric arithmetic: subtraction (2)', PRECISION)
299 .end
301 .sub 'number_multiplication'
302     $P0 = new ['Float']
304     $P0 = 0.001
305     $P0 *= 123.5
306     is($P0, 0.1235, 'Basic numeric arithmetic: multiplication (1)', PRECISION)
308     $P0 *= -2.6
309     is($P0, -0.3211, 'Basic numeric arithmetic: multiplication (2)', PRECISION)
311     $P0 *= 0.0
312     is($P0, 0.0, 'Basic numeric arithmetic: multiplication (3)', PRECISION)
313 .end
315 .sub 'number_division'
316     $P0 = new ['Float']
318     $P0 = 1e8
319     $P0 /= 0.5
320     is($P0, 2e8, 'Basic numeric arithmetic: division (1)', PRECISION)
322     $P0 /= 4000.0
323     is($P0, 50000.0, 'Basic numeric arithmetic: division (2)', PRECISION)
324 .end
326 .sub 'increment_decrement'
327     $P0 = new ['Float']
329     $P0 = 0.5
330     inc $P0
331     is($P0, 1.5, 'increment (1)', PRECISION)
332     dec $P0
333     is($P0, 0.5, 'decrement (1)', PRECISION)
334     dec $P0
335     is($P0, -.5, 'decrement (2)', PRECISION)
336     inc $P0
337     is($P0, 0.5, 'increment (2)', PRECISION)
338 .end
340 .sub 'neg'
341     $P0 = new ['Float']
342     $P0 = 0.5
343     neg $P0
344     is($P0, -0.5, 'Neg', PRECISION)
346     $P1 = new ['Float']
347     $P1 = - $P0
348     is($P1, 0.5, 'Neg is involutive', PRECISION)
349 .end
351 .sub 'negative_zero'
352     load_bytecode 'config.pbc'
353     $P1 = _config()
354     $P2 = $P1['has_negative_zero']
355     unless $P2 goto negative_zero_todoed
357     $P0 = new ['Float']
358     $P0 = 0.0
359     neg $P0
361     $S0 = $P0
362     is($S0, "-0", "negative 0.0 to string")
363     .return ()
365   negative_zero_todoed:
366     todo(0, '-0.0 not implemented, TT #313')
367 .end
369 .sub 'equality'
370     $P0 = new ['Float']
371     $P0 = 1e8
373     $P1 = new ['Float']
374     $P1 = 1e8
376     $P2 = new ['Float']
377     $P2 = 2.4
379     $I0 = 1
380     if $P0 == $P1 goto equality_1
381     $I0 = 0
382   equality_1:
383     ok($I0, 'equal floats')
385     $I0 = 0
386     if $P0 == $P2 goto equality_2
387     $I0 = 1
388   equality_2:
389     ok($I0, 'different floats are not equal')
391     $I0 = 1
392     if $P0 != $P2 goto equality_3
393     $I0 = 0
394   equality_3:
395     ok($I0, "different floats are different")
397     $I0 = 0
398     if $P0 != $P1 goto equality_4
399     $I0 = 1
400   equality_4:
401     ok($I0, "equal floats aren't different")
403     $I0 = 1
404     eq_num $P0, $P1, equality_5
405     $I0 = 0
406   equality_5:
407     ok($I0, "equal floats are eq_num")
409     $I0 = 0
410     eq_num $P0, $P2, equality_6
411     $I0 = 1
412   equality_6:
413     ok($I0, "different floats aren't eq_num")
415     $I0 = 1
416     ne_num $P0, $P2, equality_7
417     $I0 = 0
418   equality_7:
419     ok($I0, "different floats are ne_num")
421     $I0 = 0
422     ne_num $P0, $P1, equality_8
423     $I0 = 1
424   equality_8:
425     ok($I0, "equal floats aren't ne_num")
426 .end
428 .sub 'is_interface_done'
429     .local pmc pmc1
430     .local int bool1
431     pmc1 = new ['Float']
433     bool1 = does pmc1, "scalar"
434     ok(bool1, 'Float does "scalar"')
436     bool1 = does pmc1, "float"
437     ok(bool1, 'Float does "float"')
439     bool1 = does pmc1, "no_interface"
440     nok(bool1, 'Float does not "no_interface"')
441 .end
443 .sub 'abs'
444     $P0 = new ['Float']
445     $P0 = 1.0
446     abs $P0
447     is($P0, $P0, 'abs does not change positive floats')
449     $P0 = -1.0
450     abs $P0
451     is($P0, 1.0, 'abs of -1.0', PRECISION)
453     $P0 = -5.0
454     abs $P0
455     is($P0, 5.0, 'abs of -5.0', PRECISION)
457     $P0 = -6.0
458     $P1 = abs $P0
459     is($P1, 6.0, 'abs two operands from -6.0', PRECISION)
460     is($P0, -6.0, 'abs two operands source unchanged', PRECISION)
461 .end
463 .sub 'lt'
464     $P1 = new ['Float']
465     $P1 = 111.11
466     $N1 = $P1
468     $I0 = 1
469     lt $P1, 111.12, lt_1
470     $I0 = 0
471   lt_1:
472     ok($I0, 'lt ok')
474     $I0 = 0
475     lt $P1, $N1, lt_2
476     $I0 = 1
477   lt_2:
478     ok($I0, 'lt irreflexive')
480     $I0 = 0
481     lt $P1, 111.0, lt_3
482     $I0 = 1
483   lt_3:
484     ok($I0, 'not lt')
485 .end
487 .sub 'lt_num'
488     $P1 = new ['Float']
489     $P1 = 1.1
491     $P2 = new ['Float']
492     $P2 = 1.2
494     $P3 = new ['Float']
495     $P3 = 1.0
497     $P4 = new ['Float']
498     $P4 = $P1
500     $I0 = 1
501     lt_num $P1, $P2, lt_num_1
502     $I0 = 0
503   lt_num_1:
504     ok($I0, 'lt_num true')
506     $I0 = 0
507     lt_num $P1, $P4, lt_num_2
508     $I0 = 1
509   lt_num_2:
510     ok($I0, 'lt_num irreflexive')
512     $I0 = 0
513     lt_num $P1, $P3, lt_num_3
514     $I0 = 1
515   lt_num_3:
516     ok($I0, 'lt_num false')
517 .end
519 .sub 'le'
520     $P1 = new ['Float']
521     $P1 = 111.1
522     $N1 = $P1
524     $I0 = 1
525     le $P1, 111.2, le_1
526     $I0 = 0
527   le_1:
528     ok($I0, 'le_p_nc')
530     $I0 = 1
531     le $P1, $N1, le_2
532     $I0 = 0
533   le_2:
534     ok($I0, 'le_p_n')
536     $I0 = 0
537     le $P1, 111.0, le_3
538     $I0 = 1
539   le_3:
540     ok($I0, 'le_p_nc false')
542     $I0 = 1
543     le $P1, $P1, le_4
544     $I0 = 0
545   le_4:
546     ok($I0, 'le reflexive')
547 .end
549 .sub 'le_num'
550     $P1 = new ['Float']
551     $P1 = 1.1
553     $P2 = new ['Float']
554     $P2 = 1.2
556     $P3 = new ['Float']
557     $P3 = 1.0
559     $P4 = new ['Float']
560     $P4 = $P1
562     $I0 = 1
563     le_num $P1, $P2, le_num_1
564     $I0 = 0
565   le_num_1:
566     ok($I0, 'le_num true')
568     $I0 = 1
569     le_num $P1, $P4, le_num_2
570     $I0 = 0
571   le_num_2:
572     ok($I0, 'le_num reflexive')
574     $I0 = 0
575     le_num $P1, $P3, le_num_3
576     $I0 = 1
577   le_num_3:
578     ok($I0, 'le_num false')
579 .end
581 .sub 'gt'
582     $P1 = new ['Float']
583     $P1 = 111.1
584     $N1 = $P1
586     $I0 = 0
587     gt $P1, 111.2, gt_1
588     $I0 = 1
589   gt_1:
590     ok($I0, 'comparison ops: gt nok')
592     $I0 = 1
593     gt $P1, $N1, gt_2
594     $I0 = 0
595   gt_2:
596     nok($I0, 'comparison ops: gt irreflexive')
598     $I0 = 1
599     gt $P1, 111.0, gt_3
600     $I0 = 0
601   gt_3:
602     ok($I0, 'comparison ops: gt ok')
603 .end
605 .sub 'gt_num'
606     $P1 = new ['Float']
607     $P2 = new ['Float']
608     $P3 = new ['Float']
609     $P4 = new ['Float']
611     $P1 = 1.1
612     $P2 = 1.2
613     $P3 = 1.0
614     $P4 = $P1
616     $I0 = 0
617     gt_num $P1, $P2, gt_num_1
618     $I0 = 1
619   gt_num_1:
620     ok($I0, 'comparison ops: gt_num nok')
622     $I0 = 0
623     gt_num $P1, $P4, gt_num_2
624     $I0 = 1
625   gt_num_2:
626     ok($I0, 'comparison ops: gt_num irreflexive')
628     $I0 = 1
629     gt_num $P1, $P3, gt_num_3
630     $I0 = 0
631   gt_num_3:
632     ok($I0, 'comparison ops: gt_num ok')
633 .end
635 .sub 'ge'
636     $P1 = new ['Float']
637     $P1 = 111.1
638     $N1 = $P1
640     $I0 = 0
641     ge $P1, 111.2, ge_1
642     $I0 = 1
643   ge_1:
644     ok($I0, 'comparison ops: ge nok')
646     $I0 = 1
647     ge $P1, $N1, ge_2
648     $I0 = 0
649   ge_2:
650     ok($I0, 'comparison ops: ge reflexive')
652     $I0 = 1
653     ge $P1, 111.0, ge_3
654     $I0 = 0
655   ge_3:
656     ok($I0, 'comparison ops: ge ok')
657 .end
659 .sub 'ge_num'
660     $P1 = new ['Float']
661     $P2 = new ['Float']
662     $P3 = new ['Float']
663     $P4 = new ['Float']
665     $P1 = 1.1
666     $P2 = 1.2
667     $P3 = 1.0
668     $P4 = $P1
670     $I0 = 0
671     ge_num $P1, $P2, ge_num_1
672     $I0 = 1
673   ge_num_1:
674     ok($I0, 'comparison ops: ge_num nok')
676     $I0 = 1
677     ge_num $P1, $P4, ge_num_2
678     $I0 = 0
679   ge_num_2:
680     ok($I0, 'comparison ops: ge_num reflexive')
682     $I0 = 1
683     ge_num $P1, $P3, ge_num_3
684     $I0 = 0
685   ge_num_3:
686     ok($I0, 'comparison ops: ge_num ok')
687 .end
689 .sub 'cmp_p_n'
690     $P1 = new ['Float']
691     $P1 = 123.45
692     $N1 = 123.45
693     $N2 = -1.0
694     $N3 = 123.54
696     $I0 = cmp $P1, $N1
697     is($I0, 0, 'comparison ops: cmp_p_n: equality')
699     $I0 = cmp $P1, $N2
700     is($I0, 1, 'comparison ops: cmp_p_n: gt')
702     $I0 = cmp $P1, $N3
703     is($I0, -1, 'comparison ops: cmp_p_n: lt')
704 .end
706 .sub 'isgt'
707     $P1 = new ['Float']
708     $P2 = new ['Float']
709     $P3 = new ['Float']
710     $P4 = new ['Integer']
711     $P5 = new ['Integer']
712     $P6 = new ['Float']
714     $P1 = 10.0
715     $P2 = 20.0
716     $P3 = 5.0
717     $P4 = 3
718     $P5 = 12
719     $P6 = 10.0
721     $I0 = isgt $P1, $P2
722     nok($I0, 'comparison ops: isgt nok')
724     $I0 = isgt $P1, $P1
725     nok($I0, 'comparison ops: isgt irreflexive')
727     $I0 = isgt $P1, $P3
728     ok($I0, 'comparison ops: isgt ok')
730     $I0 = isgt $P1, $P4
731     ok($I0, 'comparison ops: isgt ok with Float and Integer')
733     $I0 = isgt $P1, $P5
734     nok($I0, 'comparison ops: isgt nok with Float and Integer')
736     $I0 = isgt $P1, $P6
737     nok($I0, 'comparison ops: isgt irreflexive (different PMCs)')
738 .end
740 .sub 'isge'
741     $P1 = new ['Float']
742     $P2 = new ['Float']
743     $P3 = new ['Float']
744     $P4 = new ['Integer']
745     $P5 = new ['Integer']
746     $P6 = new ['Float']
748     $P1 = 10.0
749     $P2 = 20.0
750     $P3 = 5.0
751     $P4 = 3
752     $P5 = 12
753     $P6 = 10.0
755     $I0 = isge $P1, $P2
756     nok($I0, 'comparison ops: isge nok')
758     $I0 = isge $P1, $P1
759     ok($I0, 'comparison ops: isge reflexive')
761     $I0 = isge $P1, $P3
762     ok($I0, 'comparison ops: isge ok')
764     $I0 = isge $P1, $P4
765     ok($I0, 'comparison ops: isge ok with Float and Integer')
767     $I0 = isge $P1, $P5
768     nok($I0, 'comparison ops: isge nok with Float and Integer')
770     $I0 = isge $P1, $P6
771     ok($I0, 'comparison ops: isge reflexive (different PMCs)')
772 .end
774 .sub 'islt'
775     $P1 = new ['Float']
776     $P2 = new ['Float']
777     $P3 = new ['Float']
778     $P4 = new ['Integer']
779     $P5 = new ['Integer']
780     $P6 = new ['Float']
782     $P1 = 10.0
783     $P2 = 20.0
784     $P3 = 5.0
785     $P4 = 3
786     $P5 = 12
787     $P6 = 10.0
789     $I0 = islt $P1, $P2
790     ok($I0, 'comparison ops: islt ok')
792     $I0 = islt $P1, $P1
793     nok($I0, 'comparison ops: islt irreflexive')
795     $I0 = islt $P1, $P3
796     nok($I0, 'comparison ops: islt nok')
798     $I0 = islt $P1, $P4
799     nok($I0, 'comparison ops: islt nok with Float and Integer')
801     $I0 = islt $P1, $P5
802     ok($I0, 'comparison ops: islt ok with Float and Integer')
804     $I0 = islt $P1, $P6
805     nok($I0, 'comparison ops: islt irreflexive (different PMCs)')
806 .end
808 .sub 'isle'
809     $P1 = new ['Float']
810     $P2 = new ['Float']
811     $P3 = new ['Float']
812     $P4 = new ['Integer']
813     $P5 = new ['Integer']
814     $P6 = new ['Float']
816     $P1 = 10.0
817     $P2 = 20.0
818     $P3 = 5.0
819     $P4 = 3
820     $P5 = 12
821     $P6 = 10.0
823     $I0 = isle $P1, $P2
824     ok($I0, 'comparison ops: isle ok')
826     $I0 = isle $P1, $P1
827     ok($I0, 'comparison ops: isle reflexive')
829     $I0 = isle $P1, $P3
830     nok($I0, 'comparison ops: isle nok')
832     $I0 = isle $P1, $P4
833     nok($I0, 'comparison ops: isle nok with Float and Integer')
835     $I0 = isle $P1, $P5
836     ok($I0, 'comparison ops: isle ok with Float and Integer')
838     $I0 = isle $P1, $P6
839     ok($I0, 'comparison ops: isle reflexive (different PMCs)')
840 .end
842 .sub 'iseq'
843     $P1 = new ['Float']
844     $P2 = new ['Float']
845     $P3 = new ['Float']
846     $P4 = new ['Integer']
848     $P1 = 2.5
849     $P2 = 2.6
850     $P3 = 2.5
851     $P4 = 2
853     $I0 = iseq $P1, $P1
854     ok($I0, 'iseq reflexive, same PMC')
856     $I0 = iseq $P1, $P3
857     ok($I0, 'iseq reflexive, different PMCs')
859     $I0 = iseq $P1, $P2
860     nok($I0, 'iseq nok with two Floats')
862     $I0 = iseq $P1, $P4
863     nok($I0, 'iseq nok between an Integer and a Float')
864 .end
866 .sub 'isne'
867     $P1 = new ['Float']
868     $P2 = new ['Float']
869     $P3 = new ['Float']
870     $P4 = new ['Integer']
872     $P1 = 2.5
873     $P2 = 2.6
874     $P3 = 2.5
875     $P4 = 2
877     $I0 = isne $P1, $P1
878     nok($I0, 'isne irreflexive, same PMC')
880     $I0 = isne $P1, $P3
881     nok($I0, 'isne irreflexive, different PMCs')
883     $I0 = isne $P1, $P2
884     ok($I0, 'isne ok with two Floats')
886     $I0 = isne $P1, $P4
887     ok($I0, 'isne ok between an Integer and a Float')
888 .end
890 .sub 'instantiate_str'
891     .const 'Float' pi = "3.1"
892     $P1 = get_class ['Float']
893     isa_ok(pi, $P1)
894     is(pi, 3.1, 'instantiate_str', PRECISION)
895 .end
897 .sub 'cmp_subclasses'
898     $P0 = subclass 'Float', 'Flt'
900     $P1 = new ['Flt']
901     $P1 = 1.5
903     $P2 = new ['Flt']
904     $P2 = 2.73
906     $I0 = cmp $P1, $P2
907     is(-1, $I0, 'cmp functions for subclasses (lt)')
909     $I0 = cmp $P1, $P1
910     is(0, $I0, 'cmp functions for subclasses (eq)')
912     $I0 = cmp $P2, $P1
913     is(1, $I0, 'cmp functions for subclasses (gt)')
914 .end
916 .sub 'test_method'
917     .param string method
918     .param num number
919     .param num expected
921     .local pmc array
922     array = new 'FixedPMCArray'
923     array = 3
924     array[0] = method
925     array[1] = number
926     array[2] = expected
928     $P0 = new ['Float']
929     $P0 = number
930     $P1 = $P0.method()
932     $S0 = sprintf '%s(%.1f) is %.9f', array
933     is($P1, expected, $S0, PRECISION)
934 .end
936 .sub 'acos_method'
937     test_method('acos', 0.0, 1.570796327)
938     test_method('acos', 0.5, 1.047197551)
939 .end
941 .sub 'cos_method'
942     test_method('cos', 0.0, 1.0)
943     test_method('cos', 0.5, 0.877582562)
944 .end
946 .sub 'asec_method'
947     test_method('asec', 1.0, 0.0)
948     test_method('asec', 3.0, 1.230959417)
949 .end
951 .sub 'asin_method'
952     test_method('asin', 0.0, 0.0)
953     test_method('asin', 0.5, 0.523598776)
954 .end
956 .sub 'atan_method'
957     test_method('atan', 0.0, 0.0)
958     test_method('atan', 0.5, 0.463647609)
959 .end
961 .sub 'atan2_method'
962     $P0 = new ['Float']
963     $P1 = new ['Float']
965     $P0 = 0.7
966     $P1 = 0.5
968     $P2 = $P0.'atan2'($P1)
969     is($P2, 0.950546841, 'atan2 as a method', PRECISION)
970 .end
972 .sub 'cosh_method'
973     test_method('cosh', 0.0, 1.0)
974     test_method('cosh', 0.5, 1.127625965)
975 .end
977 .sub 'exp_method'
978     test_method('exp', 0.0, 1.0)
979     test_method('exp', 0.5, 1.648721271)
980 .end
982 .sub 'ln_method'
983     test_method('ln', 1.0, 0.0)
984     test_method('ln', 45.0, 3.806662490)
985     test_method('ln', 0.5, -0.693147181)
986 .end
988 .sub 'log10_method'
989     test_method('log10', 1000.0, 3.0)
990     test_method('log10', 0.5, -0.301029996)
991 .end
993 .sub 'log2_method'
994     test_method('log2', 32.0, 5.0)
995     test_method('log2', 0.5, -1.0)
996 .end
998 .sub 'sec_method'
999     test_method('sec', 0.0, 1.0)
1000     test_method('sec', 0.5, 1.139493927)
1001 .end
1003 .sub 'csc_method'
1004     test_method('csc', 0.5, 2.0858296)
1005     test_method('csc', 1.0, 1.1883951)
1006 .end
1008 .sub 'sech_method'
1009     test_method('sech', 0.0, 1.0)
1010     test_method('sech', 0.5, 0.886818884)
1011 .end
1013 .sub 'sin_method'
1014     test_method('sin', 0.0, 0.0)
1015     test_method('sin', 0.5, 0.479425539)
1016 .end
1018 .sub 'sinh_method'
1019     test_method('sinh', 0.0, 0.0)
1020     test_method('sinh', 0.5, 0.521095305)
1021 .end
1023 .sub 'tan_method'
1024     test_method('tan', 0.0, 0.0)
1025     test_method('tan', 0.5, 0.546302490)
1026 .end
1028 .sub 'cot_method'
1029     test_method('cot', 0.5, 1.8304877)
1030     test_method('cot', 1.0, 0.64209262)
1031 .end
1033 .sub 'tanh_method'
1034     test_method('tanh', 0.0, 0.0)
1035     test_method('tanh', 0.5, 0.462117157)
1036 .end
1038 .sub 'sqrt_method'
1039     test_method('sqrt', 16.0, 4.0)
1040     test_method('sqrt', 2.0, 1.414213562)
1041 .end
1043 # Local Variables:
1044 #   mode: pir
1045 #   fill-column: 100
1046 # End:
1047 # vim: expandtab shiftwidth=4 ft=pir: