fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / complex.t
blob746bb873a08711ee97751abe8a4b8320721ca99c
1 #!./parrot
2 # Copyright (C) 2001-2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/complex.t - Complex Numbers
9 =head1 SYNOPSIS
11     % prove t/pmc/complex.t
13 =head1 DESCRIPTION
15 Tests the Complex PMC.
17 =cut
19 .sub main :main
20     .include 'test_more.pir'
21     .include 'fp_equality.pasm'
22     .include "iglobals.pasm"
24     plan(460)
26     string_parsing()
27     exception_malformed_string__real_part()
28     exception_malformed_string__imaginary_part()
29     exception_malformed_string__missing_plus_or_minus()
30     test_complex_add()
31     test_complex_subtract()
32     test_complex_multiply()
33     test_complex_divide()
34     complex_divide_by_zero_Complex()
35     complex_divide_by_zero_Float()
36     complex_divide_by_zero_Integer()
37     get_int_or_num_or_bool()
38     test_get_keyed()
39     exception_get_keyed__invalid_string_key()
40     exception_get_keyed__invalid_numeric_key()
41     set_int_or_num()
42     set_keyed()
43     exception_set_keyed__invalid_key()
44     test_is_equal()
45     test_complex_abs()
46     check_whether_interface_is_done()
47     instantiate__pasm__i()
48     instantiate__pir__n()
49     instantiate__pir__p()
50     instantiate__pir__s()
51     test_complex_neg()
52     test_clone()
53     test_freeze_thaw()
54     test_sub()
55     test_i_sub()
56     sprintf_with_a_complex()
57     ln_of_complex_numbers()
58     exp_of_complex_numbers()
59     sqrt_of_complex_numbers()
60     sin_of_complex_numbers()
61     cos_of_complex_numbers()
62     tan_of_complex_numbers()
63     cot_of_complex_numbers()
64     sec_of_complex_numbers()
65     csc_of_complex_numbers()
66     asin_of_complex_numbers()
67     acos_of_complex_numbers()
68     atan_of_complex_numbers()
69     acot_of_complex_numbers()
70     asec_of_complex_numbers()
71     acsc_of_complex_numbers()
72     sinh_of_complex_numbers()
73     cosh_of_complex_numbers()
74     tanh_of_complex_numbers()
75     coth_of_complex_numbers()
76     sech_of_complex_numbers()
77     csch_of_complex_numbers()
78     add_using_subclass_of_complex_bug_59630()
79     provides_complex()
81     # END_OF_TESTS
83 .end
85 .macro exception_is( M )
86     .local pmc exception
87     .local string message
88     .get_results (exception)
90     message = exception['message']
91     is( message, .M, .M )
92 .endm
94 .sub string_parsing
95     $P0 = new ['Complex']
96     $P1 = new ['String']
98     set $P0, "4"
99     is( $P0, "4+0i", '"4" parsed as 4+0i' )
101     set $P0, "3.14"
102     is( $P0, "3.14+0i", '"3.14" parsed as 3.14+0i' )
104     set $P0, ".5"
105     is( $P0, "0.5+0i", '".5" parsed as 0.5+0i' )
107     set $P0, "-13"
108     is( $P0, "-13+0i", '"-13" parsed as -13+0i' )
110     set $P0, "-.3"
111     is( $P0, "-0.3+0i", '"-.3" parsed as -0.3+0i' )
113     set $P0, "i"
114     is( $P0, "0+1i", '"i" parsed as 0+1i' )
116     set $P0, "-i"
117     is( $P0, "0-1i", '"-i" parsed as 0-1i' )
119     set $P0, ".3i"
120     is( $P0, "0+0.3i", '".3i" parsed as 0+0.3i' )
122     set $P0, "2 + 3i"
123     is( $P0, "2+3i", '"2 + 3i" parsed as 2+3i' )
125     set $P0, "4 + 3.5i"
126     is( $P0, "4+3.5i", '"4 + 3.5i" parsed as 4+3.5i' )
128     set $P0, "2 + .1 i"
129     is( $P0, "2+0.1i", '"2 + .1 i" parsed as 2+0.1i' )
131     set $P0, "10 - i"
132     is( $P0, "10-1i", '"10 - i" parsed as 10-1i' )
134     set $P0, "5 - .3i"
135     is( $P0, "5-0.3i", '"5 - .3i" parsed as 5-0.3i' )
137     set $P1, "-4-i"
138     assign $P0, $P1
139     is( $P0, "-4-1i", '"-4-i" parsed as -4-1i' )
141     set $P1, "- 20 - .5 i"
142     assign $P0, $P1
143     is( $P0, "-20-0.5i", '"- 20 - .5 i" parsed as -20-0.5i' )
145     set $P1, "-13 +2i"
146     assign $P0, $P1
147     is( $P0, "-13+2i", '"-13 +2i" parsed as -13+2i' )
148 .end
150 .sub exception_malformed_string__real_part
151     $P0 = new ['Complex']
152     push_eh handler
153         set $P0, "q + 3i"
154     pop_eh
155 handler:
156     .exception_is( "Complex: malformed string" )
157 .end
159 .sub exception_malformed_string__imaginary_part
160     $P0 = new ['Complex']
161     push_eh handler
162         set $P0, "1 + ij"
163     pop_eh
164 handler:
165     .exception_is( "Complex: malformed string" )
166 .end
168 .sub exception_malformed_string__missing_plus_or_minus
169     $P0 = new ['Complex']
170     push_eh handler
171         set $P0, "1 * i"
172     pop_eh
173 handler:
174     .exception_is( "Complex: malformed string" )
175 .end
177 .sub test_complex_add
178     $P0 = new ['Complex']
179     $P1 = new ['Complex']
180     $P2 = new ['Float']
181     $P3 = new ['Integer']
183     set $P0, "1 + i"
184     add $P0, $P0, $P0
185     is( $P0, "2+2i", '1+i plus 1+i' )
187     set $P0, "1 - i"
188     set $P1, "1 + i"
189     add $P0, $P0, $P1
190     is( $P0, "2+0i", '1-i plus 1+i' )
191     is( $P1, "1+1i", '1+i as text is 1+1i' )
193     set $P0, "-i"
194     set $P1, "1"
195     add $P1, $P0, $P1
196     is( $P0, "0-1i", '-i as text is 0-1i' )
197     is( $P1, "1-1i", '-i plus 1 is 1-1i' )
199     set $P0, "2 + i"
200     set $P2, 3.3
201     add $P1, $P0, $P2
202     is( $P1, "5.3+1i", '2+i plus 3.3 is 5.3+1i' )
204     set $P0, "3 + 5i"
205     add $P1, $P0, 2
206     is( $P1, "5+5i", '3+5i plus literal 2 is 5+5i' )
208     set $P0, "2 + 2i"
209     add $P1, $P0, -2.0
210     is( $P1, "0+2i", '2+2i plus literal -2.0 is 0+2i' )
212     set $P0, "3 + 3i"
213     set $P3, -3
214     add $P1, $P0, $P3
215     is( $P1, "0+3i", '3+3i plus -3 is 0+3i' )
216     add $P1, $P3, $P0
217     is( $P1, "0+3i", '-2 plus 3+3i is 0+3i' )
218 .end
220 .sub test_complex_subtract
221     $P0 = new ['Complex']
222     $P1 = new ['Complex']
223     $P2 = new ['Float']
224     $P3 = new ['Integer']
226     set $P0, "1 + i"
227     sub $P0, $P0, $P0
228     is( $P0, "0+0i", '1+i minus 1+i is 0+0i' )
230     set $P0, "1 - i"
231     set $P1, "1 + i"
232     sub $P0, $P0, $P1
233     is( $P0, "0-2i", '1-i minus 1+i is 0-2i' )
234     is( $P1, "1+1i", '... original $3 is  unchanged' )
236     set $P0, "-i"
237     set $P1, "1"
238     sub $P1, $P0, $P1
239     is( $P0, "0-1i", '-i minus 1 is 0-1i' )
240     is( $P1, "-1-1i", '... original $3 is unchanged' )
242     set $P0, "1 - 4i"
243     set $P2, -1.0
244     sub $P1, $P0, $P2
245     is( $P1, "2-4i", '1-4i minus -1.0 is 2-4i' )
247     set $P0, "- 2 - 2i"
248     sub $P1, $P0, -4
249     is( $P1, "2-2i", '-2-2i minus -4 is 2-2i' )
251     set $P0, "3 + i"
252     sub $P1, $P0, 1.2
253     is( $P1, "1.8+1i", '3+i - literal 1.2 is 1.8+1i' )
255     set $P0, "1024 - 3i"
256     set $P3, 2048
257     sub $P1, $P0, $P3
258     is( $P1, "-1024-3i", '1024-3i minus 2048 is -1024-3i' )
259     sub $P1, $P3, $P0
260     is( $P1, "1024+3i", '2048 minus 1024-3i is 1024+3i' )
261 .end
263 .sub test_complex_multiply
264     $P0 = new ['Complex']
265     $P1 = new ['Complex']
266     $P2 = new ['Float']
267     $P3 = new ['Integer']
269     set $P0, "2 + 3i"
270     mul $P0, $P0, $P0
271     is( $P0, "-5+12i", '2+3i x 2+3i = -5+12i' )
273     set $P0, "5 - 2i"
274     set $P1, "5 + 2i"
275     mul $P0, $P0, $P1
276     is( $P0, "29+0i", '5-2i x 5+2i = 29+0i' )
277     is( $P1, "5+2i", '... original $3 is unchanged' )
279     set $P0, "3i"
280     set $P1, "2 - i"
281     mul $P1, $P0, $P1
282     is( $P0, "0+3i", '3i x 2-i = 0+3i' )
283     is( $P1, "3+6i", '... original $3 is unchanged' )
285     set $P0, "2 - 2i"
286     set $P2, 0.5
287     mul $P1, $P0, $P2
288     is( $P1, "1-1i", '2-2i x 0.5 = 1-1i' )
290     set $P0, "1 - i"
291     mul $P1, $P0, 2
292     is( $P1, "2-2i", '1-i x literal 2 = 2-2i' )
294     set $P0, "-1 + i"
295     mul $P1, $P0, -1.0
296     is( $P1, "1-1i", '-1+i x literal -1.0 = 1-1i' )
298     set $P0, "1 + i"
299     set $P3, 10
300     mul $P1, $P0, $P3
301     is( $P1, "10+10i", '1+i x literal 10 = 10+10i' )
303     mul $P1, $P3, $P0
304     is( $P1, "10+10i", '10 x 1+i is 10+10i' )
305  .end
307 .sub test_complex_divide
308     $P0 = new ['Complex']
309     $P1 = new ['Complex']
310     $P2 = new ['Float']
312     set $P0, "2 + 3i"
313     div $P0, $P0, $P0
314     is( $P0, "1+0i", '2+3i / 2+3i = 1+0i' )
316     set $P0, "3 + 5i"
317     set $P1, "5 - 3i"
318     div $P0, $P0, $P1
319     is( $P0, "0+1i", '3+5i / 5-3i = 0+1i' )
320     is( $P1, "5-3i", '... original $3 is unchanged' )
322     set $P0, "25"
323     set $P1, "3 + 4i"
324     div $P1, $P0, $P1
325     is( $P1, "3-4i", '25 / 3+4i = 3-4i' )
326     is( $P0, "25+0i", '... original $2 is unchanged' )
328     set $P0, "-3 + 6i"
329     set $P2, 3.0
330     div $P1, $P0, $P2
331     is( $P1, "-1+2i", '-3+6i / 3.0 = -1+2i' )
333     set $P0, "-2 + 3i"
334     div $P1, $P0, 2
335     is( $P1, "-1+1.5i", '-2+3i / 2 = -1+1.5i' )
337     set $P0, "2 - 3i"
338     div $P1, $P0, 0.5
339     is( $P1, "4-6i", '2-3i / 0.5 = 4-6i' )
340 .end
342 .sub complex_divide_by_zero_Complex
343     skip( 1, 'div by zero not caught' )
344     .return()
346     $P0 = new ['Complex']
347     set $P0, "4+3.5i"
348     $P1 = new ['Complex']
349     ## divide by a zero Complex
350     $P2 = new ['Complex']
351     set $P2, 0
352     push_eh handler
353         $P1 = $P0 / $P2
354     pop_eh
355 handler:
356     .exception_is( 'Divide by zero' )
357 .end
359 .sub complex_divide_by_zero_Float
360     skip( 1, 'div by zero not caught' )
361     .return()
363     $P0 = new ['Complex']
364     set $P0, "4+3.5i"
365     $P1 = new ['Complex']
366     ## divide by a zero Float
367     $P2 = new ['Float']
368     set $P2, 0
369     push_eh handler
370         $P1 = $P0 / $P2
371 handler:
372     .exception_is( 'Divide by zero' )
373 .end
375 .sub complex_divide_by_zero_Integer
376     skip( 1, 'div by zero not caught' )
377     .return()
379     $P0 = new ['Complex']
380     set $P0, "4+3.5i"
381     $P1 = new ['Complex']
382     ## divide by a zero Integer
383     $P2 = new ['Integer']
384     set $P2, 0
385     push_eh handler
386         $P1 = $P0 / $P2
387 handler:
388     .exception_is( 'Divide by zero' )
389 .end
391 .sub get_int_or_num_or_bool
392         $P0 = new ['Complex']
393         set $P0, "2 - 1.5i"
394         is( $P0, "2-1.5i", 'Complex "2 - 1.5i" returned ok' )
396         set $I0, $P0
397         is( $I0, "2", 'Complex -> Int = 2' )
399         set $N0, $P0
400         .fp_eq_ok( $N0, 2.5, 'Complex -> Num = 2.5')
402         ok( $P0, 'Complex(2-1.5i) -> bool = true' )
404         set $P0, "0"
405         nok( $P0, 'Complex(0) -> bool = true' )
406 .end
408 .sub test_get_keyed
409         $P0 = new ['Complex']
410         $P1 = new ['String']
411         set $P0, "- 3.3 + 1.2i"
412         set $P1, "imag"
414         set $N0, $P0["real"]
415         set $N1, $P0["imag"]
416         set $N2, $P0[$P1]
417         .fp_eq_ok( $N0, -3.3, 'got real part')
418         .fp_eq_ok( $N1, 1.2, 'got imag part')
419         .fp_eq_ok( $N2, 1.2, 'got imag part using variable' )
421         set $P2, $P0["real"]
422         set $P3, $P0[$P1]
423         is( $P2, "-3.3", 'get real portion of -3.3i1.2i' )
424         is( $P3, "1.2", 'get imag portion of -3.3+1.2i' )
426         set $I0, $P0["real"]
427         set $I1, $P0[$P1]
428         is( $I0, "-3", 'get real portion -> Int' )
429         is( $I1, "1", 'get imag portion -> Int' )
430 .end
432 .sub exception_get_keyed__invalid_string_key
433     $P0 = new ['Complex']
434     set $P0, "5 + 3.5i"
435     push_eh handler
436         set $N0, $P0["Foo55"]
437 handler:
438     .exception_is( "Complex: key is neither 'real' or 'imag'" )
439 .end
441 .sub exception_get_keyed__invalid_numeric_key
442     $P0 = new ['Complex']
443     set $P0, "5 + 3.5i"
444     push_eh handler
445         set $N0, $P0[2]
446 handler:
447     .exception_is( "Complex: key must be 0 or 1" )
448 .end
450 .sub set_int_or_num
451     $P0 = new ['Complex']
453     set $P0, "3 + 4i"
454     set $P0, -2
455     is( $P0, "-2+0i", '-2 -> Complex = -2+0i' )
457     set $P0, "2 + 5i"
458     set $P0, .4
459     is( $P0, "0.4+0i", '.4 -> Complex = 0.4+0i' )
460 .end
462 .sub set_keyed
463     $P0 = new ['Complex']
464     $P1 = new ['String']
465     $P2 = new ['String']
466     set $P1, "real"
468     set $P0[$P1], 1
469     set $P0["imag"], 4
470     is( $P0, "1+4i", 'set imag and real portion separately' )
472     set $P0[$P1], 3.2
473     set $P0["imag"], -2.3
474     is( $P0, "3.2-2.3i", '... again' )
476     set $P2, ".5"
477     set $P0[$P1], $P2
478     set $P2, 6
479     set $P0["imag"], $P2
480     is( $P0, "0.5+6i", '... now using String PMCs' )
481 .end
483 .sub exception_set_keyed__invalid_key
484     $P0 = new ['Complex']
485     push_eh handler
486         set $P0[2], 12.5
487 handler:
488     .exception_is( "Complex: key must be 0 or 1" )
489 .end
491 .sub test_is_equal
492     $P0 = new ['Complex']
493     $P1 = new ['Complex']
495     set $P0, "2 + 3j"
496     set $P1["real"], 2
497     set $P1["imag"], 3
499     is( $P0, $P1, 'create new Complex from real/imag and test eq' )
500     set $P1, 0
501     isnt( $P0, $P1, '... now make sure it ne to 0' )
502 .end
504 .sub test_complex_abs
505     $P0 = new ['Complex']
506     set $P0, "4 + 3i"
507     $P1 = new ['Undef']
508     abs $P1, $P0
509     is( $P1, "5", 'abs 4+3j -> 5' )
510 .end
512 .sub check_whether_interface_is_done
513     .local pmc pmc1
514     pmc1 = new ['Complex']
515     .local int bool1
517     does bool1, pmc1, "scalar"
518     ok( bool1, 'Complex does scalar' )
520     does bool1, pmc1, "no_interface"
521     nok( bool1, 'Complex !does no_interface' )
522 .end
524 .sub instantiate__pasm__i
525     skip( 1, 'instantiate n/y' )
526     .return()
528     set $I0, 1
529     set $I1, 2
530     set $I2, 0
531     set $I3, 0
532     set $I4, 0
533     set $I5, 10
534     set $I6, 20
535     get_class $P2, "Complex"
536     # instantiate $P1
537     is( $P1, "10+20i", 'instantiate pasm i' )
538 .end
540 .sub instantiate__pir__n
541     skip( 1, 'instantiate n/y' )
542     .return()
544     $P0 = get_class "Complex"
545     # $P1 = $P0."instantiate"(2.0, 3.0)
546     is( $P1, "2+3i", 'instantiate pir n' )
547 .end
549 .sub instantiate__pir__p
550     skip( 1, 'instantiate n/y' )
551     .return()
553     $P0 = get_class "Complex"
554     $P1 = new ['Float']
555     $P1 = 2.0
556     $P2 = new ['Float']
557     $P2 = 3.0
558     # $P1 = $P0."instantiate"($P1, $P2)
559     is( $P1, "2+3i", 'instantiate pir p' )
560 .end
562 .sub instantiate__pir__s
563     skip( 1, 'instantiate n/y' )
564     .return()
566     $P0 = get_class "Complex"
567     # $P1 = $P0."instantiate"("2 + 3i")
568     is( $P1, "2+3i", 'instantiate pir s' )
569 .end
571 .sub test_complex_neg
572      $P0 = new ['Complex']
573      set $P0, "1.3 + 1.7i"
574      $P1 = new ['Integer']
575      neg $P1, $P0
576      set $N0, $P1[0]
577      set $N1, $P1[1]
578      .fp_eq_ok($N0, -1.3, 'test complex negative')
579      .fp_eq_ok($N1, -1.7, '... and the imag port')
580 .end
582 .sub test_clone
583      $P0 = new ['Complex']
584      set $P0, "1 - 3i"
585      clone $P1, $P0
586      is( $P0, $P1, 'clone Complex PMC')
588      set $P0, "0 + 0i"
589      set $N0, $P1[0]
590      set $N1, $P1[1]
591      .fp_eq_ok($N0, 1.0, 'no change to cloned after setting orig')
592      .fp_eq_ok($N1, -3.0, '... nor to imag portion')
593 .end
595 .sub test_freeze_thaw
596     $P0 = new ['Complex']
597     set $P0, "1 - 3i"
598     $S0 = freeze $P0
599     $P1 = thaw $S0
600     is($P0, $P1, 'roundtrip serialize Complex PMC')
601 .end
603 .sub test_sub
604     .local pmc d, f, c
605     d = new ['Undef']
606     f = new ['Float']
607     c = new ['Complex']
608     f = 2.2
609     c = "5+2j"
610     d = c - f
611     is( d, "2.8+2i", '5+2j - 2.2 = 2.8+i (using d=c-f)' )
613     typeof $S0, d
614     is( $S0, "Complex", 'd is typeof Complex' )
616     d = f - c
617     is( d, "-2.8-2i", '2.2 - 5+2j = -2.8-2i' )
619     typeof $S0, d
620     is( $S0, "Complex", 'typeof still Complex' )
621 .end
623 .sub test_i_sub
624     .local pmc f, c
625     f = new ['Float']
626     f = 2.2
627     c = new ['Complex']
628     c = "5+2j"
629     c -= f
630     is( c, '2.8+2i', 'Complex -= test' )
631     c = new ['Complex']
632     c = "5+2j"
633     f -= c
634     is( f, '-2.8-2i', '... and reverse it' )
635 .end
637 .macro sprintf_is(fmt, number, message)
638     c = .number
639     $S0 = sprintf .fmt, c
640     $S1 = .message
641     is( $S0, $S1, $S1 )
642 .endm
644 .sub sprintf_with_a_complex
645     .local pmc c, c2
646     c = new ['Complex']
647     .sprintf_is( "%d%+di", "1.35+35.1i", "1+35i" )
648     .sprintf_is( "%.3f%+.3fi", "0+3.141592653589793i", "0.000+3.142i" )
649     .sprintf_is( "%.3f%+.3fi", "0+i", "0.000+1.000i" )
650 .end
652 # # The inverse hyperbolic functions are broken wrt -0.0
653 # # Need to find some formal spec for when to return -0.0.
655 .macro complex_op_is( val, res, op )
656     $P1 = new ['Complex']
657     $P2 = new ['Complex']
658     set $P1, .val
660     set $S0, .val
661     set $S1, .res
662     set $S2, .op
664     #XXX: can't do $P1.'$S2'()
665     $P2 = $P1. $S2()
666     $S3 = sprintf "%f%+fi", $P2
668     concat $S4, $S2, " of "
669     concat $S4, $S4, $S0
671     is( $S3, $S1, $S4 )
672 .endm
674 .macro complex_op_todo( val, res, op, todo )
675     $P1 = new ['Complex']
676     $P2 = new ['Complex']
677     set $P1, .val
679     set $S0, .val
680     set $S1, .res
681     set $S2, .op
682     set $S3, .todo
684     #XXX: can't do $P1.'$S2'()
685     $P2 = $P1. $S2()
686     $S3 = sprintf "%f%+fi", $P2
688     concat $S5, $S2, " of "
689     concat $S5, $S5, $S4
691     $I0 = iseq $S1, $S3
692     todo( $I0, $S4 )
693 .endm
695 .sub ln_of_complex_numbers
696     .complex_op_is("-2+0i", "0.693147+3.141593i", 'ln' )
697     .complex_op_is("-1+0i", "0.000000+3.141593i", 'ln' )
698     .complex_op_is("-0.5+0i", "-0.693147+3.141593i", 'ln' )
699     .complex_op_is("0.5+0i", "-0.693147+0.000000i", 'ln' )
700     .complex_op_is("1+0i", "0.000000+0.000000i", 'ln' )
701     .complex_op_is("2+0i", "0.693147+0.000000i", 'ln' )
702     .complex_op_is("0-2i", "0.693147-1.570796i", 'ln' )
703     .complex_op_is("0-1i", "0.000000-1.570796i", 'ln' )
704     .complex_op_is("0-0.5i", "-0.693147-1.570796i", 'ln' )
705     .complex_op_is("0+0.5i", "-0.693147+1.570796i", 'ln' )
706     .complex_op_is("0+1i", "0.000000+1.570796i", 'ln' )
707     .complex_op_is("0+2i", "0.693147+1.570796i", 'ln' )
708   t_inf:
709     skip(1, 'inf is not platform-independent' )
710     goto end_inf
711     .complex_op_is("0+0i", "-inf+0.000000i", 'ln' )
712   end_inf:
713     .complex_op_is("2+3i", "1.282475+0.982794i", 'ln' )
714     .complex_op_is("2-3i", "1.282475-0.982794i", 'ln' )
715     .complex_op_is("-2+3i", "1.282475+2.158799i", 'ln' )
716     .complex_op_is("-2-3i", "1.282475-2.158799i", 'ln' )
717 .end
719 .sub exp_of_complex_numbers
720     .complex_op_is( "-2+0i", "0.135335+0.000000i", 'exp' )
721     .complex_op_is( "-1+0i", "0.367879+0.000000i", 'exp' )
722     .complex_op_is( "-0.5+0i", "0.606531+0.000000i", 'exp' )
723     .complex_op_is( "0.5+0i", "1.648721+0.000000i", 'exp' )
724     .complex_op_is( "1+0i", "2.718282+0.000000i", 'exp' )
725     .complex_op_is( "2+0i", "7.389056+0.000000i", 'exp' )
726     .complex_op_is( "0-2i", "-0.416147-0.909297i", 'exp' )
727     .complex_op_is( "0-1i", "0.540302-0.841471i", 'exp' )
728     .complex_op_is( "0-0.5i", "0.877583-0.479426i", 'exp' )
729     .complex_op_is( "0+0.5i", "0.877583+0.479426i", 'exp' )
730     .complex_op_is( "0+1i", "0.540302+0.841471i", 'exp' )
731     .complex_op_is( "0+2i", "-0.416147+0.909297i", 'exp' )
732     .complex_op_is( "0+0i", "1.000000+0.000000i", 'exp' )
733     .complex_op_is( "2+3i", "-7.315110+1.042744i", 'exp' )
734     .complex_op_is( "2-3i", "-7.315110-1.042744i", 'exp' )
735     .complex_op_is( "-2+3i", "-0.133981+0.019099i", 'exp' )
736     .complex_op_is( "-2-3i", "-0.133981-0.019099i", 'exp' )
737 .end
739 .sub sqrt_of_complex_numbers
740     .complex_op_is( "4", "2.000000+0.000000i", 'sqrt' )
741     .complex_op_is( "i", "0.707107+0.707107i", 'sqrt' )
742     .complex_op_is( "2i","1.000000+1.000000i", 'sqrt' )
743     .complex_op_is( "2+2i", "1.553774+0.643594i", 'sqrt' )
744     .complex_op_is( "1+i", "1.098684+0.455090i", 'sqrt' )
745     .complex_op_is( "-2+0i", "0.000000+1.414214i", 'sqrt' )
746     .complex_op_is( "-1+0i", "0.000000+1.000000i", 'sqrt' )
747     .complex_op_is( "-0.5+0i", "0.000000+0.707107i", 'sqrt' )
748     .complex_op_is( "0.5+0i", "0.707107+0.000000i", 'sqrt' )
749     .complex_op_is( "1+0i", "1.000000+0.000000i", 'sqrt' )
750     .complex_op_is( "2+0i", "1.414214+0.000000i", 'sqrt' )
751     .complex_op_is( "0-2i", "1.000000-1.000000i", 'sqrt' )
752     .complex_op_is( "0-1i", "0.707107-0.707107i", 'sqrt' )
753     .complex_op_is( "0-0.5i", "0.500000-0.500000i", 'sqrt' )
754     .complex_op_is( "0+0.5i", "0.500000+0.500000i", 'sqrt' )
755     .complex_op_is( "0+1i", "0.707107+0.707107i", 'sqrt' )
756     .complex_op_is( "0+2i", "1.000000+1.000000i", 'sqrt' )
757     .complex_op_is( "0+0i", "0.000000+0.000000i", 'sqrt' )
758     .complex_op_is( "2+3i", "1.674149+0.895977i", 'sqrt' )
759     .complex_op_is( "2-3i", "1.674149-0.895977i", 'sqrt' )
760     .complex_op_is( "-2+3i", "0.895977+1.674149i", 'sqrt' )
761     .complex_op_is( "-2-3i", "0.895977-1.674149i", 'sqrt' )
762 .end
764 .sub sin_of_complex_numbers
765     .complex_op_is("-2+0i", "-0.909297+0.000000i", 'sin' )
766     .complex_op_is("-1+0i", "-0.841471+0.000000i", 'sin' )
767     .complex_op_is("-0.5+0i", "-0.479426+0.000000i", 'sin' )
768     .complex_op_is("0.5+0i", "0.479426+0.000000i", 'sin' )
769     .complex_op_is("1+0i", "0.841471+0.000000i", 'sin' )
770     .complex_op_is("2+0i", "0.909297+0.000000i", 'sin' )
771     .complex_op_is("0-2i", "0.000000-3.626860i", 'sin' )
772     .complex_op_is("0-1i", "0.000000-1.175201i", 'sin' )
773     .complex_op_is("0-0.5i", "0.000000-0.521095i", 'sin' )
774     .complex_op_is("0+0.5i", "0.000000+0.521095i", 'sin' )
775     .complex_op_is("0+1i", "0.000000+1.175201i", 'sin' )
776     .complex_op_is("0+2i", "0.000000+3.626860i", 'sin' )
777     .complex_op_is("0+0i", "0.000000+0.000000i", 'sin' )
778     .complex_op_is("2+3i", "9.154499-4.168907i", 'sin' )
779     .complex_op_is("2-3i", "9.154499+4.168907i", 'sin' )
780     .complex_op_is("-2+3i", "-9.154499-4.168907i", 'sin' )
781     .complex_op_is("-2-3i", "-9.154499+4.168907i", 'sin' )
782 .end
784 .sub cos_of_complex_numbers
785     .complex_op_is("-2+0i", "-0.416147+0.000000i", 'cos' )
786     .complex_op_is("-1+0i", "0.540302+0.000000i", 'cos' )
787     .complex_op_is("-0.5+0i", "0.877583+0.000000i", 'cos' )
788     .complex_op_is("0.5+0i", "0.877583+0.000000i", 'cos' )
789     .complex_op_is("1+0i", "0.540302+0.000000i", 'cos' )
790     .complex_op_is("2+0i", "-0.416147+0.000000i", 'cos' )
791     .complex_op_is("0-2i", "3.762196+0.000000i", 'cos' )
792     .complex_op_is("0-1i", "1.543081+0.000000i", 'cos' )
793     .complex_op_is("0-0.5i", "1.127626+0.000000i", 'cos' )
794     .complex_op_is("0+0.5i", "1.127626+0.000000i", 'cos' )
795     .complex_op_is("0+1i", "1.543081+0.000000i", 'cos' )
796     .complex_op_is("0+2i", "3.762196+0.000000i", 'cos' )
797     .complex_op_is("0+0i", "1.000000+0.000000i", 'cos' )
798     .complex_op_is("2+3i", "-4.189626-9.109228i", 'cos' )
799     .complex_op_is("2-3i", "-4.189626+9.109228i", 'cos' )
800     .complex_op_is("-2+3i", "-4.189626+9.109228i", 'cos' )
801     .complex_op_is("-2-3i", "-4.189626-9.109228i", 'cos' )
802 .end
804 .sub tan_of_complex_numbers
805     .complex_op_is("-2+0i", "2.185040+0.000000i", 'tan' )
806     .complex_op_is("-1+0i", "-1.557408+0.000000i", 'tan' )
807     .complex_op_is("-0.5+0i", "-0.546302+0.000000i", 'tan' )
808     .complex_op_is("0.5+0i", "0.546302+0.000000i", 'tan' )
809     .complex_op_is("1+0i", "1.557408+0.000000i", 'tan' )
810     .complex_op_is("2+0i", "-2.185040+0.000000i", 'tan' )
811     .complex_op_is("0-2i", "0.000000-0.964028i", 'tan' )
812     .complex_op_is("0-1i", "0.000000-0.761594i", 'tan' )
813     .complex_op_is("0-0.5i", "0.000000-0.462117i", 'tan' )
814     .complex_op_is("0+0.5i", "0.000000+0.462117i", 'tan' )
815     .complex_op_is("0+1i", "0.000000+0.761594i", 'tan' )
816     .complex_op_is("0+2i", "0.000000+0.964028i", 'tan' )
817     .complex_op_is("0+0i", "0.000000+0.000000i", 'tan' )
818     .complex_op_is("2+3i", "-0.003764+1.003239i", 'tan' )
819     .complex_op_is("2-3i", "-0.003764-1.003239i", 'tan' )
820     .complex_op_is("-2+3i", "0.003764+1.003239i", 'tan' )
821     .complex_op_is("-2-3i", "0.003764-1.003239i", 'tan' )
822 .end
824 .sub cot_of_complex_numbers
825     .complex_op_is("-2+0i", "0.457658+0.000000i", 'cot' )
826     .complex_op_is("-1+0i", "-0.642093+0.000000i", 'cot' )
827     .complex_op_is("-0.5+0i", "-1.830488+0.000000i", 'cot' )
828     .complex_op_is("0.5+0i", "1.830488+0.000000i", 'cot' )
829     .complex_op_is("1+0i", "0.642093+0.000000i", 'cot' )
830     .complex_op_is("2+0i", "-0.457658+0.000000i", 'cot' )
831     .complex_op_is("0-2i", "0.000000+1.037315i", 'cot' )
832     .complex_op_is("0-1i", "0.000000+1.313035i", 'cot' )
833     .complex_op_is("0-0.5i", "0.000000+2.163953i", 'cot' )
834     .complex_op_is("0+0.5i", "0.000000-2.163953i", 'cot' )
835     .complex_op_is("0+1i", "0.000000-1.313035i", 'cot' )
836     .complex_op_is("0+2i", "0.000000-1.037315i", 'cot' )
837     .complex_op_is("2+3i", "-0.003740-0.996758i", 'cot' )
838     .complex_op_is("2-3i", "-0.003740+0.996758i", 'cot' )
839     .complex_op_is("-2+3i", "0.003740-0.996758i", 'cot' )
840     .complex_op_is("-2-3i", "0.003740+0.996758i", 'cot' )
841 .end
843 .sub sec_of_complex_numbers
844     .complex_op_is("-2+0i", "-2.402998+0.000000i", 'sec' )
845     .complex_op_is("-1+0i", "1.850816+0.000000i", 'sec' )
846     .complex_op_is("-0.5+0i", "1.139494+0.000000i", 'sec' )
847     .complex_op_is("0.5+0i", "1.139494+0.000000i", 'sec' )
848     .complex_op_is("1+0i", "1.850816+0.000000i", 'sec' )
849     .complex_op_is("2+0i", "-2.402998+0.000000i", 'sec' )
850     .complex_op_is("0-2i", "0.265802+0.000000i", 'sec' )
851     .complex_op_is("0-1i", "0.648054+0.000000i", 'sec' )
852     .complex_op_is("0-0.5i", "0.886819+0.000000i", 'sec' )
853     .complex_op_is("0+0.5i", "0.886819+0.000000i", 'sec' )
854     .complex_op_is("0+1i", "0.648054+0.000000i", 'sec' )
855     .complex_op_is("0+2i", "0.265802+0.000000i", 'sec' )
856     .complex_op_is("0+0i", "1.000000+0.000000i", 'sec' )
857     .complex_op_is("2+3i", "-0.041675+0.090611i", 'sec' )
858     .complex_op_is("2-3i", "-0.041675-0.090611i", 'sec' )
859     .complex_op_is("-2+3i", "-0.041675-0.090611i", 'sec' )
860     .complex_op_is("-2-3i", "-0.041675+0.090611i", 'sec' )
861 .end
863 .sub csc_of_complex_numbers
864     .complex_op_is("-2+0i", "-1.099750+0.000000i", 'csc' )
865     .complex_op_is("-1+0i", "-1.188395+0.000000i", 'csc' )
866     .complex_op_is("-0.5+0i", "-2.085830+0.000000i", 'csc' )
867     .complex_op_is("0.5+0i", "2.085830+0.000000i", 'csc' )
868     .complex_op_is("1+0i", "1.188395+0.000000i", 'csc' )
869     .complex_op_is("2+0i", "1.099750+0.000000i", 'csc' )
870     .complex_op_is("0-2i", "0.000000+0.275721i", 'csc' )
871     .complex_op_is("0-1i", "0.000000+0.850918i", 'csc' )
872     .complex_op_is("0-0.5i", "0.000000+1.919035i", 'csc' )
873     .complex_op_is("0+0.5i", "0.000000-1.919035i", 'csc' )
874     .complex_op_is("0+1i", "0.000000-0.850918i", 'csc' )
875     .complex_op_is("0+2i", "0.000000-0.275721i", 'csc' )
876     .complex_op_is("2+3i", "0.090473+0.041201i", 'csc' )
877     .complex_op_is("2-3i", "0.090473-0.041201i", 'csc' )
878     .complex_op_is("-2+3i", "-0.090473+0.041201i", 'csc' )
879     .complex_op_is("-2-3i", "-0.090473-0.041201i", 'csc' )
880 .end
882 .sub asin_of_complex_numbers
883     .complex_op_is("-2+0i", "-1.570796+1.316958i", 'asin' )
884     .complex_op_is("-1+0i", "-1.570796+0.000000i", 'asin' )
885     .complex_op_is("-0.5+0i", "-0.523599+0.000000i", 'asin' )
886     .complex_op_is("0.5+0i", "0.523599+0.000000i", 'asin' )
887     .complex_op_is("1+0i", "1.570796+0.000000i", 'asin' )
888     .complex_op_is("2+0i", "1.570796-1.316958i", 'asin' )
889     .complex_op_is("0-2i", "0.000000-1.443635i", 'asin' )
890     .complex_op_is("0-1i", "0.000000-0.881374i", 'asin' )
891     .complex_op_is("0-0.5i", "0.000000-0.481212i", 'asin' )
892     .complex_op_is("0+0.5i", "0.000000+0.481212i", 'asin' )
893     .complex_op_is("0+1i", "0.000000+0.881374i", 'asin' )
894     .complex_op_is("0+2i", "0.000000+1.443635i", 'asin' )
895     .complex_op_is("0+0i", "0.000000+0.000000i", 'asin' )
896     .complex_op_is("2+3i", "0.570653+1.983387i", 'asin' )
897     .complex_op_is("2-3i", "0.570653-1.983387i", 'asin' )
898     .complex_op_is("-2+3i", "-0.570653+1.983387i", 'asin' )
899     .complex_op_is("-2-3i", "-0.570653-1.983387i", 'asin' )
900 .end
902 .sub acos_of_complex_numbers
903     .complex_op_is("-2+0i", "3.141593-1.316958i", 'acos' )
904     .complex_op_is("-1+0i", "3.141593+0.000000i", 'acos' )
905     .complex_op_is("-0.5+0i", "2.094395+0.000000i", 'acos' )
906     .complex_op_is("0.5+0i", "1.047198+0.000000i", 'acos' )
907     .complex_op_is("1+0i", "0.000000+0.000000i", 'acos' )
908     .complex_op_is("2+0i", "0.000000+1.316958i", 'acos' )
909     .complex_op_is("0-2i", "1.570796+1.443635i", 'acos' )
910     .complex_op_is("0-1i", "1.570796+0.881374i", 'acos' )
911     .complex_op_is("0-0.5i", "1.570796+0.481212i", 'acos' )
912     .complex_op_is("0+0.5i", "1.570796-0.481212i", 'acos' )
913     .complex_op_is("0+1i", "1.570796-0.881374i", 'acos' )
914     .complex_op_is("0+2i", "1.570796-1.443635i", 'acos' )
915     .complex_op_is("0+0i", "1.570796+0.000000i", 'acos' )
916     .complex_op_is("2+3i", "1.000144-1.983387i", 'acos' )
917     .complex_op_is("2-3i", "1.000144+1.983387i", 'acos' )
918     .complex_op_is("-2+3i", "2.141449-1.983387i", 'acos' )
919     .complex_op_is("-2-3i", "2.141449+1.983387i", 'acos' )
920 .end
922 .sub atan_of_complex_numbers
923     .complex_op_is("-2+0i", "-1.107149+0.000000i", 'atan' )
924     .complex_op_is("-1+0i", "-0.785398+0.000000i", 'atan' )
925     .complex_op_is("-0.5+0i", "-0.463648+0.000000i", 'atan' )
926     .complex_op_is("0.5+0i", "0.463648+0.000000i", 'atan' )
927     .complex_op_is("1+0i", "0.785398+0.000000i", 'atan' )
928     .complex_op_is("2+0i", "1.107149+0.000000i", 'atan' )
929     .complex_op_is("0-2i", "-1.570796-0.549306i", 'atan' )
930     .complex_op_is("0-0.5i", "0.000000-0.549306i", 'atan' )
931     .complex_op_is("0+0.5i", "0.000000+0.549306i", 'atan' )
932     .complex_op_is("0+2i", "-1.570796+0.549306i", 'atan' )
933     .complex_op_is("0+0i", "0.000000+0.000000i", 'atan' )
934     .complex_op_is("2+3i", "1.409921+0.229073i", 'atan' )
935     .complex_op_is("2-3i", "1.409921-0.229073i", 'atan' )
936     .complex_op_is("-2+3i", "-1.409921+0.229073i", 'atan' )
937     .complex_op_is("-2-3i", "-1.409921-0.229073i", 'atan' )
938 .end
940 .sub acot_of_complex_numbers
941     .complex_op_is("-2+0i", "-0.463648+0.000000i", 'acot' )
942     .complex_op_is("-1+0i", "-0.785398+0.000000i", 'acot' )
943     .complex_op_is("-0.5+0i", "-1.107149+0.000000i", 'acot' )
944     .complex_op_is("0.5+0i", "1.107149+0.000000i", 'acot' )
945     .complex_op_is("1+0i", "0.785398+0.000000i", 'acot' )
946     .complex_op_is("2+0i", "0.463648+0.000000i", 'acot' )
947     .complex_op_is("0-2i", "0.000000+0.549306i", 'acot' )
948     .complex_op_is("0-0.5i", "-1.570796+0.549306i", 'acot' )
949     .complex_op_is("0+0.5i", "-1.570796-0.549306i", 'acot' )
950     .complex_op_is("0+2i", "0.000000-0.549306i", 'acot' )
951     .complex_op_is("2+3i", "0.160875-0.229073i", 'acot' )
952     .complex_op_is("2-3i", "0.160875+0.229073i", 'acot' )
953     .complex_op_is("-2+3i", "-0.160875-0.229073i", 'acot' )
954     .complex_op_is("-2-3i", "-0.160875+0.229073i", 'acot' )
955 .end
957 .sub asec_of_complex_numbers
958     .complex_op_is("-2+0i", "2.094395+0.000000i", 'asec' )
959     .complex_op_is("-1+0i", "3.141593+0.000000i", 'asec' )
960     .complex_op_is("-0.5+0i", "3.141593-1.316958i", 'asec' )
961     .complex_op_is("0.5+0i", "0.000000+1.316958i", 'asec' )
962     .complex_op_is("1+0i", "0.000000+0.000000i", 'asec' )
963     .complex_op_is("2+0i", "1.047198+0.000000i", 'asec' )
964     .complex_op_is("0-2i", "1.570796-0.481212i", 'asec' )
965     .complex_op_is("0-1i", "1.570796-0.881374i", 'asec' )
966     .complex_op_is("0-0.5i", "1.570796-1.443635i", 'asec' )
967     .complex_op_is("0+0.5i", "1.570796+1.443635i", 'asec' )
968     .complex_op_is("0+1i", "1.570796+0.881374i", 'asec' )
969     .complex_op_is("0+2i", "1.570796+0.481212i", 'asec' )
970     .complex_op_is("2+3i", "1.420411+0.231335i", 'asec' )
971     .complex_op_is("2-3i", "1.420411-0.231335i", 'asec' )
972     .complex_op_is("-2+3i", "1.721182+0.231335i", 'asec' )
973     .complex_op_is("-2-3i", "1.721182-0.231335i", 'asec' )
974 .end
976 .sub acsc_of_complex_numbers
977     .complex_op_is("-2+0i", "-0.523599+0.000000i", 'acsc' )
978     .complex_op_is("-1+0i", "-1.570796+0.000000i", 'acsc' )
979     .complex_op_is("-0.5+0i", "-1.570796+1.316958i", 'acsc' )
980     .complex_op_is("0.5+0i", "1.570796-1.316958i", 'acsc' )
981     .complex_op_is("1+0i", "1.570796+0.000000i", 'acsc' )
982     .complex_op_is("2+0i", "0.523599+0.000000i", 'acsc' )
983     .complex_op_is("0-2i", "0.000000+0.481212i", 'acsc' )
984     .complex_op_is("0-1i", "0.000000+0.881374i", 'acsc' )
985     .complex_op_is("0-0.5i", "0.000000+1.443635i", 'acsc' )
986     .complex_op_is("0+0.5i", "0.000000-1.443635i", 'acsc' )
987     .complex_op_is("0+1i", "0.000000-0.881374i", 'acsc' )
988     .complex_op_is("0+2i", "0.000000-0.481212i", 'acsc' )
989     .complex_op_is("2+3i", "0.150386-0.231335i", 'acsc' )
990     .complex_op_is("2-3i", "0.150386+0.231335i", 'acsc' )
991     .complex_op_is("-2+3i", "-0.150386-0.231335i", 'acsc' )
992     .complex_op_is("-2-3i", "-0.150386+0.231335i", 'acsc' )
993 .end
995 .sub sinh_of_complex_numbers
996     .local pmc config_hash, interp
997     .local string has_negative_zero
998     interp = getinterp
999     config_hash = interp[.IGLOBALS_CONFIG_HASH]
1000     has_negative_zero = config_hash["has_negative_zero"]
1002     .complex_op_is("-2+0i", "-3.626860+0.000000i", 'sinh' )
1003     .complex_op_is("-1+0i", "-1.175201+0.000000i", 'sinh' )
1004     .complex_op_is("-0.5+0i", "-0.521095+0.000000i", 'sinh' )
1005     .complex_op_is("0.5+0i", "0.521095+0.000000i", 'sinh' )
1006     .complex_op_is("1+0i", "1.175201+0.000000i", 'sinh' )
1007     .complex_op_is("2+0i", "3.626860+0.000000i", 'sinh' )
1008     .complex_op_is("0-1i", "0.000000-0.841471i", 'sinh' )
1009     .complex_op_is("0-0.5i", "0.000000-0.479426i", 'sinh' )
1010     .complex_op_is("0+0.5i", "0.000000+0.479426i", 'sinh' )
1011     .complex_op_is("0+1i", "0.000000+0.841471i", 'sinh' )
1012     .complex_op_is("0+0i", "0.000000+0.000000i", 'sinh' )
1013     .complex_op_is("2+3i", "-3.590565+0.530921i", 'sinh' )
1014     .complex_op_is("2-3i", "-3.590565-0.530921i", 'sinh' )
1015     .complex_op_is("-2+3i", "3.590565+0.530921i", 'sinh' )
1016     .complex_op_is("-2-3i", "3.590565-0.530921i", 'sinh' )
1018     unless has_negative_zero goto todo
1019     .complex_op_is("0-2i", "-0.000000-0.909297i", 'sinh' )
1020     .complex_op_is("0+2i", "-0.000000+0.909297i", 'sinh' )
1021     .return()
1023 todo:
1024     .complex_op_todo("0-2i", "-0.000000-0.909297i", 'sinh', 'TT #313' )
1025     .complex_op_todo("0+2i", "-0.000000+0.909297i", 'sinh', 'TT #313' )
1026     .return()
1027 .end
1029 .sub cosh_of_complex_numbers
1030     .complex_op_is("-2+0i", "3.762196+0.000000i", 'cosh' )
1031     .complex_op_is("-1+0i", "1.543081+0.000000i", 'cosh' )
1032     .complex_op_is("-0.5+0i", "1.127626+0.000000i", 'cosh' )
1033     .complex_op_is("0.5+0i", "1.127626+0.000000i", 'cosh' )
1034     .complex_op_is("1+0i", "1.543081+0.000000i", 'cosh' )
1035     .complex_op_is("2+0i", "3.762196+0.000000i", 'cosh' )
1036     .complex_op_is("0-2i", "-0.416147+0.000000i", 'cosh' )
1037     .complex_op_is("0-1i", "0.540302+0.000000i", 'cosh' )
1038     .complex_op_is("0-0.5i", "0.877583+0.000000i", 'cosh' )
1039     .complex_op_is("0+0.5i", "0.877583+0.000000i", 'cosh' )
1040     .complex_op_is("0+1i", "0.540302+0.000000i", 'cosh' )
1041     .complex_op_is("0+2i", "-0.416147+0.000000i", 'cosh' )
1042     .complex_op_is("0+0i", "1.000000+0.000000i", 'cosh' )
1043     .complex_op_is("2+3i", "-3.724546+0.511823i", 'cosh' )
1044     .complex_op_is("2-3i", "-3.724546-0.511823i", 'cosh' )
1045     .complex_op_is("-2+3i", "-3.724546-0.511823i", 'cosh' )
1046     .complex_op_is("-2-3i", "-3.724546+0.511823i", 'cosh' )
1047 .end
1049 .sub tanh_of_complex_numbers
1050     .complex_op_is("-2+0i", "-0.964028+0.000000i", 'tanh' )
1051     .complex_op_is("-1+0i", "-0.761594+0.000000i", 'tanh' )
1052     .complex_op_is("-0.5+0i", "-0.462117+0.000000i", 'tanh' )
1053     .complex_op_is("0.5+0i", "0.462117+0.000000i", 'tanh' )
1054     .complex_op_is("1+0i", "0.761594+0.000000i", 'tanh' )
1055     .complex_op_is("2+0i", "0.964028+0.000000i", 'tanh' )
1056     .complex_op_is("0-2i", "0.000000+2.185040i", 'tanh' )
1057     .complex_op_is("0-1i", "0.000000-1.557408i", 'tanh' )
1058     .complex_op_is("0-0.5i", "0.000000-0.546302i", 'tanh' )
1059     .complex_op_is("0+0.5i", "0.000000+0.546302i", 'tanh' )
1060     .complex_op_is("0+1i", "0.000000+1.557408i", 'tanh' )
1061     .complex_op_is("0+2i", "0.000000-2.185040i", 'tanh' )
1062     .complex_op_is("0+0i", "0.000000+0.000000i", 'tanh' )
1063     .complex_op_is("2+3i", "0.965386-0.009884i", 'tanh' )
1064     .complex_op_is("2-3i", "0.965386+0.009884i", 'tanh' )
1065     .complex_op_is("-2+3i", "-0.965386-0.009884i", 'tanh' )
1066     .complex_op_is("-2-3i", "-0.965386+0.009884i", 'tanh' )
1067 .end
1069 .sub coth_of_complex_numbers
1070     .complex_op_is("-2+0i", "-1.037315+0.000000i", 'coth' )
1071     .complex_op_is("-1+0i", "-1.313035+0.000000i", 'coth' )
1072     .complex_op_is("-0.5+0i", "-2.163953+0.000000i", 'coth' )
1073     .complex_op_is("0.5+0i", "2.163953+0.000000i", 'coth' )
1074     .complex_op_is("1+0i", "1.313035+0.000000i", 'coth' )
1075     .complex_op_is("2+0i", "1.037315+0.000000i", 'coth' )
1076     .complex_op_is("0-2i", "0.000000-0.457658i", 'coth' )
1077     .complex_op_is("0-1i", "0.000000+0.642093i", 'coth' )
1078     .complex_op_is("0-0.5i", "0.000000+1.830488i", 'coth' )
1079     .complex_op_is("0+0.5i", "0.000000-1.830488i", 'coth' )
1080     .complex_op_is("0+1i", "0.000000-0.642093i", 'coth' )
1081     .complex_op_is("0+2i", "0.000000+0.457658i", 'coth' )
1082     .complex_op_is("2+3i", "1.035747+0.010605i", 'coth' )
1083     .complex_op_is("2-3i", "1.035747-0.010605i", 'coth' )
1084     .complex_op_is("-2+3i", "-1.035747+0.010605i", 'coth' )
1085     .complex_op_is("-2-3i", "-1.035747-0.010605i", 'coth' )
1086 .end
1088 .sub sech_of_complex_numbers
1089     .complex_op_is("-2+0i", "0.265802+0.000000i", 'sech' )
1090     .complex_op_is("-1+0i", "0.648054+0.000000i", 'sech' )
1091     .complex_op_is("-0.5+0i", "0.886819+0.000000i", 'sech' )
1092     .complex_op_is("0.5+0i", "0.886819+0.000000i", 'sech' )
1093     .complex_op_is("1+0i", "0.648054+0.000000i", 'sech' )
1094     .complex_op_is("2+0i", "0.265802+0.000000i", 'sech' )
1095     .complex_op_is("0-2i", "-2.402998+0.000000i", 'sech' )
1096     .complex_op_is("0-1i", "1.850816+0.000000i", 'sech' )
1097     .complex_op_is("0-0.5i", "1.139494+0.000000i", 'sech' )
1098     .complex_op_is("0+0.5i", "1.139494+0.000000i", 'sech' )
1099     .complex_op_is("0+1i", "1.850816+0.000000i", 'sech' )
1100     .complex_op_is("0+2i", "-2.402998+0.000000i", 'sech' )
1101     .complex_op_is("0+0i", "1.000000+0.000000i", 'sech' )
1102     .complex_op_is("2+3i", "-0.263513-0.036212i", 'sech' )
1103     .complex_op_is("2-3i", "-0.263513+0.036212i", 'sech' )
1104     .complex_op_is("-2+3i", "-0.263513+0.036212i", 'sech' )
1105     .complex_op_is("-2-3i", "-0.263513-0.036212i", 'sech' )
1106 .end
1108 .sub csch_of_complex_numbers
1109     .complex_op_is("-2+0i", "-0.275721+0.000000i", 'csch' )
1110     .complex_op_is("-1+0i", "-0.850918+0.000000i", 'csch' )
1111     .complex_op_is("-0.5+0i", "-1.919035+0.000000i", 'csch' )
1112     .complex_op_is("0.5+0i", "1.919035+0.000000i", 'csch' )
1113     .complex_op_is("1+0i", "0.850918+0.000000i", 'csch' )
1114     .complex_op_is("2+0i", "0.275721+0.000000i", 'csch' )
1115     .complex_op_is("0-2i", "0.000000+1.099750i", 'csch' )
1116     .complex_op_is("0-1i", "0.000000+1.188395i", 'csch' )
1117     .complex_op_is("0-0.5i", "0.000000+2.085830i", 'csch' )
1118     .complex_op_is("0+0.5i", "0.000000-2.085830i", 'csch' )
1119     .complex_op_is("0+1i", "0.000000-1.188395i", 'csch' )
1120     .complex_op_is("0+2i", "0.000000-1.099750i", 'csch' )
1121     .complex_op_is("2+3i", "-0.272549-0.040301i", 'csch' )
1122     .complex_op_is("2-3i", "-0.272549+0.040301i", 'csch' )
1123     .complex_op_is("-2+3i", "0.272549-0.040301i", 'csch' )
1124     .complex_op_is("-2-3i", "0.272549+0.040301i", 'csch' )
1125 .end
1127 .sub add_using_subclass_of_complex_bug_59630
1128     $P0 = subclass 'Complex', 'MyComplex'
1129     addattribute $P0, "re"
1130     addattribute $P0, "im"
1132     .local pmc a, b, c, expected
1133     ##   a = 1 + 2i
1134     a = new ['MyComplex']
1135     a['real'] = 1
1136     a['imag'] = 2
1137     is( a, "1+2i", 'a created' )
1139     ##   b = 3 + 4i
1140     b = new ['MyComplex']
1141     b['real'] = 3
1142     b['imag'] = 4
1143     is( b, "3+4i" , 'b created' )
1145     ##   c = a + b
1146     c = add a, b
1147     expected = new ['MyComplex']
1148     expected['real'] = 4
1149     expected['imag'] = 6
1150     $I0 = c == expected
1151     $S1 = c
1152     $S0 = concat $S1, ' != '
1153     $S1 = expected
1154     $S0 = concat $S0, $S1
1155     $S0 = concat $S0, ' - subclassing Complex add returns 0+0i - TT #562'
1156     $I0 = not $I0    # invert $I0 so todo does not pass
1157     todo( $I0, $S0 )
1158 .end
1160 .sub provides_complex
1161     $P0 = new 'Complex'
1162     $I0 = does $P0, 'complex'
1163     ok($I0)
1165     # ...And test a subclass, for good measure
1166     $P0 = new 'MyComplex'
1167     $I0 = does $P0, 'complex'
1168     ok($I0)
1169 .end
1171 .namespace ['MyComplex']
1173 .sub 'init' :vtable
1174     $P1 = new ['Float']
1175     setattribute self, "re", $P1
1176     $P2 = new ['Float']
1177     setattribute self, "im", $P2
1178 .end
1180 .namespace []   # revert to root for next test
1183 # Local Variables:
1184 #   mode: pir
1185 #   fill-column: 100
1186 # End:
1187 # vim: expandtab shiftwidth=4 ft=pir: