1#!./perl
2
3#
4# Regression tests for the Math::Complex pacakge
5# -- Raphael Manfredi	since Sep 1996
6# -- Jarkko Hietaniemi	since Mar 1997
7# -- Daniel S. Lewart	since Sep 1997
8
9BEGIN {
10    if ($ENV{PERL_CORE}) {
11	chdir 't' if -d 't';
12	@INC = '../lib';
13    }
14}
15
16use Math::Complex;
17
18use vars qw($VERSION);
19
20$VERSION = 1.92;
21
22my ($args, $op, $target, $test, $test_set, $try, $val, $zvalue, @set, @val);
23
24$test = 0;
25$| = 1;
26my @script = (
27    'my ($res, $s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$z0,$z1,$z2);' .
28	"\n\n"
29);
30my $eps = 1e-13;
31
32if ($^O eq 'unicos') { 	# For some reason root() produces very inaccurate
33    $eps = 1e-10;	# results in Cray UNICOS, and occasionally also
34}			# cos(), sin(), cosh(), sinh().  The division
35			# of doubles is the current suspect.
36
37while (<DATA>) {
38	s/^\s+//;
39	next if $_ eq '' || /^\#/;
40	chomp;
41	$test_set = 0;		# Assume not a test over a set of values
42	if (/^&(.+)/) {
43		$op = $1;
44		next;
45	}
46	elsif (/^\{(.+)\}/) {
47		set($1, \@set, \@val);
48		next;
49	}
50	elsif (s/^\|//) {
51		$test_set = 1;	# Requests we loop over the set...
52	}
53	my @args = split(/:/);
54	if ($test_set == 1) {
55		my $i;
56		for ($i = 0; $i < @set; $i++) {
57			# complex number
58			$target = $set[$i];
59			# textual value as found in set definition
60			$zvalue = $val[$i];
61			test($zvalue, $target, @args);
62		}
63	} else {
64		test($op, undef, @args);
65	}
66}
67
68#
69
70sub test_mutators {
71    my $op;
72
73    $test++;
74push(@script, <<'EOT');
75{
76    my $z = cplx(  1,  1);
77    $z->Re(2);
78    $z->Im(3);
79    print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n";
80    print 'not ' unless Re($z) == 2 and Im($z) == 3;
81EOT
82    push(@script, qq(print "ok $test\\n"}\n));
83
84    $test++;
85push(@script, <<'EOT');
86{
87    my $z = cplx(  1,  1);
88    $z->abs(3 * sqrt(2));
89    print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n";
90    print 'not ' unless (abs($z) - 3 * sqrt(2)) < $eps and
91                        (arg($z) - pi / 4     ) < $eps and
92                        (Re($z) - 3           ) < $eps and
93                        (Im($z) - 3           ) < $eps;
94EOT
95    push(@script, qq(print "ok $test\\n"}\n));
96
97    $test++;
98push(@script, <<'EOT');
99{
100    my $z = cplx(  1,  1);
101    $z->arg(-3 / 4 * pi);
102    print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n";
103    print 'not ' unless (arg($z) + 3 / 4 * pi) < $eps and
104                        (abs($z) - sqrt(2)   ) < $eps and
105                        (Re($z) + 1          ) < $eps and
106                        (Im($z) + 1          ) < $eps;
107EOT
108    push(@script, qq(print "ok $test\\n"}\n));
109}
110
111test_mutators();
112
113my $constants = '
114my $i    = cplx(0,  1);
115my $pi   = cplx(pi, 0);
116my $pii  = cplx(0, pi);
117my $pip2 = cplx(pi/2, 0);
118my $pip4 = cplx(pi/4, 0);
119my $zero = cplx(0, 0);
120my $inf  = 9**9**9;
121';
122
123push(@script, $constants);
124
125
126# test the divbyzeros
127
128sub test_dbz {
129    for my $op (@_) {
130	$test++;
131	push(@script, <<EOT);
132	eval '$op';
133	(\$bad) = (\$@ =~ /(.+)/);
134	print "# $test op = $op divbyzero? \$bad...\n";
135	print 'not ' unless (\$@ =~ /Division by zero/);
136EOT
137        push(@script, qq(print "ok $test\\n";\n));
138    }
139}
140
141# test the logofzeros
142
143sub test_loz {
144    for my $op (@_) {
145	$test++;
146	push(@script, <<EOT);
147	eval '$op';
148	(\$bad) = (\$@ =~ /(.+)/);
149	print "# $test op = $op logofzero? \$bad...\n";
150	print 'not ' unless (\$@ =~ /Logarithm of zero/);
151EOT
152        push(@script, qq(print "ok $test\\n";\n));
153    }
154}
155
156test_dbz(
157	 'i/0',
158	 'acot(0)',
159	 'acot(+$i)',
160#	 'acoth(-1)',	# Log of zero.
161	 'acoth(0)',
162	 'acoth(+1)',
163	 'acsc(0)',
164	 'acsch(0)',
165	 'asec(0)',
166	 'asech(0)',
167	 'atan($i)',
168#	 'atanh(-1)',	# Log of zero.
169	 'atanh(+1)',
170	 'cot(0)',
171	 'coth(0)',
172	 'csc(0)',
173	 'csch(0)',
174	 'atan(cplx(0, 1), cplx(1, 0))',
175	);
176
177test_loz(
178	 'log($zero)',
179	 'atan(-$i)',
180	 'acot(-$i)',
181	 'atanh(-1)',
182	 'acoth(-1)',
183	);
184
185# test the bad roots
186
187sub test_broot {
188    for my $op (@_) {
189	$test++;
190	push(@script, <<EOT);
191	eval 'root(2, $op)';
192	(\$bad) = (\$@ =~ /(.+)/);
193	print "# $test op = $op badroot? \$bad...\n";
194	print 'not ' unless (\$@ =~ /root rank must be/);
195EOT
196        push(@script, qq(print "ok $test\\n";\n));
197    }
198}
199
200test_broot(qw(-3 -2.1 0 0.99));
201
202sub test_display_format {
203    $test++;
204    push @script, <<EOS;
205    print "# package display_format cartesian?\n";
206    print "not " unless Math::Complex->display_format eq 'cartesian';
207    print "ok $test\n";
208EOS
209
210    push @script, <<EOS;
211    my \$j = (root(1,3))[1];
212
213    \$j->display_format('polar');
214EOS
215
216    $test++;
217    push @script, <<EOS;
218    print "# j display_format polar?\n";
219    print "not " unless \$j->display_format eq 'polar';
220    print "ok $test\n";
221EOS
222
223    $test++;
224    push @script, <<EOS;
225    print "# j = \$j\n";
226    print "not " unless "\$j" eq "[1,2pi/3]";
227    print "ok $test\n";
228
229    my %display_format;
230
231    %display_format = \$j->display_format;
232EOS
233
234    $test++;
235    push @script, <<EOS;
236    print "# display_format{style} polar?\n";
237    print "not " unless \$display_format{style} eq 'polar';
238    print "ok $test\n";
239EOS
240
241    $test++;
242    push @script, <<EOS;
243    print "# keys %display_format == 2?\n";
244    print "not " unless keys %display_format == 2;
245    print "ok $test\n";
246
247    \$j->display_format('style' => 'cartesian', 'format' => '%.5f');
248EOS
249
250    $test++;
251    push @script, <<EOS;
252    print "# j = \$j\n";
253    print "not " unless "\$j" eq "-0.50000+0.86603i";
254    print "ok $test\n";
255
256    %display_format = \$j->display_format;
257EOS
258
259    $test++;
260    push @script, <<EOS;
261    print "# display_format{format} %.5f?\n";
262    print "not " unless \$display_format{format} eq '%.5f';
263    print "ok $test\n";
264EOS
265
266    $test++;
267    push @script, <<EOS;
268    print "# keys %display_format == 3?\n";
269    print "not " unless keys %display_format == 3;
270    print "ok $test\n";
271
272    \$j->display_format('format' => undef);
273EOS
274
275    $test++;
276    push @script, <<EOS;
277    print "# j = \$j\n";
278    print "not " unless "\$j" =~ /^-0(?:\\.5(?:0000\\d+)?|\\.49999\\d+)\\+0.86602540\\d+i\$/;
279    print "ok $test\n";
280
281    \$j->display_format('style' => 'polar', 'polar_pretty_print' => 0);
282EOS
283
284    $test++;
285    push @script, <<EOS;
286    print "# j = \$j\n";
287    print "not " unless "\$j" =~ /^\\[1,2\\.09439510\\d+\\]\$/;
288    print "ok $test\n";
289
290    \$j->display_format('style' => 'cartesian', 'format' => '(%.5g)');
291EOS
292
293    $test++;
294    push @script, <<EOS;
295    print "# j = \$j\n";
296    print "not " unless "\$j" eq "(-0.5)+(0.86603)i";
297    print "ok $test\n";
298EOS
299
300    $test++;
301    push @script, <<EOS;
302    print "# j display_format cartesian?\n";
303    print "not " unless \$j->display_format eq 'cartesian';
304    print "ok $test\n";
305EOS
306}
307
308test_display_format();
309
310sub test_remake {
311    $test++;
312    push @script, <<EOS;
313    print "# remake 2+3i\n";
314    \$z = cplx('2+3i');
315    print "not " unless \$z == Math::Complex->make(2,3);
316    print "ok $test\n";
317EOS
318
319    $test++;
320    push @script, <<EOS;
321    print "# make 3i\n";
322    \$z = Math::Complex->make('3i');
323    print "not " unless \$z == cplx(0,3);
324    print "ok $test\n";
325EOS
326
327    $test++;
328    push @script, <<EOS;
329    print "# emake [2,3]\n";
330    \$z = Math::Complex->emake('[2,3]');
331    print "not " unless \$z == cplxe(2,3);
332    print "ok $test\n";
333EOS
334
335    $test++;
336    push @script, <<EOS;
337    print "# make (2,3)\n";
338    \$z = Math::Complex->make('(2,3)');
339    print "not " unless \$z == cplx(2,3);
340    print "ok $test\n";
341EOS
342
343    $test++;
344    push @script, <<EOS;
345    print "# emake [2,3pi/8]\n";
346    \$z = Math::Complex->emake('[2,3pi/8]');
347    print "not " unless \$z == cplxe(2,3*\$pi/8);
348    print "ok $test\n";
349EOS
350
351    $test++;
352    push @script, <<EOS;
353    print "# emake [2]\n";
354    \$z = Math::Complex->emake('[2]');
355    print "not " unless \$z == cplxe(2);
356    print "ok $test\n";
357EOS
358}
359
360sub test_no_args {
361    push @script, <<'EOS';
362{
363    print "# cplx, cplxe, make, emake without arguments\n";
364EOS
365
366    $test++;
367    push @script, <<EOS;
368    my \$z0 = cplx();
369    print ((\$z0->Re()  == 0) ? "ok $test\n" : "not ok $test\n");
370EOS
371
372    $test++;
373    push @script, <<EOS;
374    print ((\$z0->Im()  == 0) ? "ok $test\n" : "not ok $test\n");
375EOS
376
377    $test++;
378    push @script, <<EOS;
379    my \$z1 = cplxe();
380    print ((\$z1->rho()   == 0) ? "ok $test\n" : "not ok $test\n");
381EOS
382
383    $test++;
384    push @script, <<EOS;
385    print ((\$z1->theta() == 0) ? "ok $test\n" : "not ok $test\n");
386EOS
387
388    $test++;
389    push @script, <<EOS;
390    my \$z2 = Math::Complex->make();
391    print ((\$z2->Re()  == 0) ? "ok $test\n" : "not ok $test\n");
392EOS
393
394    $test++;
395    push @script, <<EOS;
396    print ((\$z2->Im()  == 0) ? "ok $test\n" : "not ok $test\n");
397EOS
398
399    $test++;
400    push @script, <<EOS;
401    my \$z3 = Math::Complex->emake();
402    print ((\$z3->rho()   == 0) ? "ok $test\n" : "not ok $test\n");
403EOS
404
405    $test++;
406    push @script, <<EOS;
407    print ((\$z3->theta() == 0) ? "ok $test\n" : "not ok $test\n");
408}
409EOS
410}
411
412sub test_atan2 {
413    push @script, <<'EOS';
414print "# atan2() with some real arguments\n";
415EOS
416    my @real = (-1, 0, 1);
417    for my $x (@real) {
418	for my $y (@real) {
419	    next if $x == 0 && $y == 0;
420	    $test++;
421	    push @script, <<EOS;
422print ((Math::Complex::atan2($y, $x) == CORE::atan2($y, $x)) ? "ok $test\n" : "not ok $test\n");
423EOS
424        }
425    }
426    push @script, <<'EOS';
427    print "# atan2() with some complex arguments\n";
428EOS
429    $test++;
430    push @script, <<EOS;
431    print (abs(atan2(0, cplx(0, 1))) < $eps ? "ok $test\n" : "not ok $test\n");
432EOS
433    $test++;
434    push @script, <<EOS;
435    print (abs(atan2(cplx(0, 1), 0) - \$pip2) < $eps ? "ok $test\n" : "not ok $test\n");
436EOS
437    $test++;
438    push @script, <<EOS;
439    print (abs(atan2(cplx(0, 1), cplx(0, 1)) - \$pip4) < $eps ? "ok $test\n" : "not ok $test\n");
440EOS
441    $test++;
442    push @script, <<EOS;
443    print (abs(atan2(cplx(0, 1), cplx(1, 1)) - cplx(0.553574358897045, 0.402359478108525)) < $eps ? "ok $test\n" : "not ok $test\n");
444EOS
445}
446
447sub test_decplx {
448}
449
450test_remake();
451
452test_no_args();
453
454test_atan2();
455
456test_decplx();
457
458print "1..$test\n";
459#print @script, "\n";
460eval join '', @script;
461die $@ if $@;
462
463sub abop {
464	my ($op) = @_;
465
466	push(@script, qq(print "# $op=\n";));
467}
468
469sub test {
470	my ($op, $z, @args) = @_;
471	my ($baop) = 0;
472	$test++;
473	my $i;
474	$baop = 1 if ($op =~ s/;=$//);
475	for ($i = 0; $i < @args; $i++) {
476		$val = value($args[$i]);
477		push @script, "\$z$i = $val;\n";
478	}
479	if (defined $z) {
480		$args = "'$op'";		# Really the value
481		$try = "abs(\$z0 - \$z1) <= $eps ? \$z1 : \$z0";
482		push @script, "\$res = $try; ";
483		push @script, "check($test, $args[0], \$res, \$z$#args, $args);\n";
484	} else {
485		my ($try, $args);
486		if (@args == 2) {
487			$try = "$op \$z0";
488			$args = "'$args[0]'";
489		} else {
490			$try = ($op =~ /^\w/) ? "$op(\$z0, \$z1)" : "\$z0 $op \$z1";
491			$args = "'$args[0]', '$args[1]'";
492		}
493		push @script, "\$res = $try; ";
494		push @script, "check($test, '$try', \$res, \$z$#args, $args);\n";
495		if (@args > 2 and $baop) { # binary assignment ops
496			$test++;
497			# check the op= works
498			push @script, <<EOB;
499{
500	my \$za = cplx(ref \$z0 ? \@{\$z0->cartesian} : (\$z0, 0));
501
502	my (\$z1r, \$z1i) = ref \$z1 ? \@{\$z1->cartesian} : (\$z1, 0);
503
504	my \$zb = cplx(\$z1r, \$z1i);
505
506	\$za $op= \$zb;
507	my (\$zbr, \$zbi) = \@{\$zb->cartesian};
508
509	check($test, '\$z0 $op= \$z1', \$za, \$z$#args, $args);
510EOB
511			$test++;
512			# check that the rhs has not changed
513			push @script, qq(print "not " unless (\$zbr == \$z1r and \$zbi == \$z1i););
514			push @script, qq(print "ok $test\\n";\n);
515			push @script, "}\n";
516		}
517	}
518}
519
520sub set {
521	my ($set, $setref, $valref) = @_;
522	@{$setref} = ();
523	@{$valref} = ();
524	my @set = split(/;\s*/, $set);
525	my @res;
526	my $i;
527	for ($i = 0; $i < @set; $i++) {
528		push(@{$valref}, $set[$i]);
529		my $val = value($set[$i]);
530		push @script, "\$s$i = $val;\n";
531		push @{$setref}, "\$s$i";
532	}
533}
534
535sub value {
536	local ($_) = @_;
537	if (/^\s*\((.*),(.*)\)/) {
538		return "cplx($1,$2)";
539	}
540	elsif (/^\s*([\-\+]?(?:\d+(\.\d+)?|\.\d+)(?:[e[\-\+]\d+])?)/) {
541		return "cplx($1,0)";
542	}
543	elsif (/^\s*\[(.*),(.*)\]/) {
544		return "cplxe($1,$2)";
545	}
546	elsif (/^\s*'(.*)'/) {
547		my $ex = $1;
548		$ex =~ s/\bz\b/$target/g;
549		$ex =~ s/\br\b/abs($target)/g;
550		$ex =~ s/\bt\b/arg($target)/g;
551		$ex =~ s/\ba\b/Re($target)/g;
552		$ex =~ s/\bb\b/Im($target)/g;
553		return $ex;
554	}
555	elsif (/^\s*"(.*)"/) {
556		return "\"$1\"";
557	}
558	return $_;
559}
560
561sub check {
562	my ($test, $try, $got, $expected, @z) = @_;
563
564	print "# @_\n";
565
566	if ("$got" eq "$expected"
567	    ||
568	    ($expected =~ /^-?\d/ && $got == $expected)
569	    ||
570	    (abs(Math::Complex->make($got) - Math::Complex->make($expected)) < $eps)
571	    ||
572	    (abs($got - $expected) < $eps)
573	    ) {
574		print "ok $test\n";
575	} else {
576		print "not ok $test\n";
577		my $args = (@z == 1) ? "z = $z[0]" : "z0 = $z[0], z1 = $z[1]";
578		print "# '$try' expected: '$expected' got: '$got' for $args\n";
579	}
580}
581
582sub addsq {
583    my ($z1, $z2) = @_;
584    return ($z1 + i*$z2) * ($z1 - i*$z2);
585}
586
587sub subsq {
588    my ($z1, $z2) = @_;
589    return ($z1 + $z2) * ($z1 - $z2);
590}
591
592__END__
593&+;=
594(3,4):(3,4):(6,8)
595(-3,4):(3,-4):(0,0)
596(3,4):-3:(0,4)
5971:(4,2):(5,2)
598[2,0]:[2,pi]:(0,0)
599
600&++
601(2,1):(3,1)
602
603&-;=
604(2,3):(-2,-3)
605[2,pi/2]:[2,-(pi)/2]
6062:[2,0]:(0,0)
607[3,0]:2:(1,0)
6083:(4,5):(-1,-5)
609(4,5):3:(1,5)
610(2,1):(3,5):(-1,-4)
611
612&--
613(1,2):(0,2)
614[2,pi]:[3,pi]
615
616&*;=
617(0,1):(0,1):(-1,0)
618(4,5):(1,0):(4,5)
619[2,2*pi/3]:(1,0):[2,2*pi/3]
6202:(0,1):(0,2)
621(0,1):3:(0,3)
622(0,1):(4,1):(-1,4)
623(2,1):(4,-1):(9,2)
624
625&/;=
626(3,4):(3,4):(1,0)
627(4,-5):1:(4,-5)
6281:(0,1):(0,-1)
629(0,6):(0,2):(3,0)
630(9,2):(4,-1):(2,1)
631[4,pi]:[2,pi/2]:[2,pi/2]
632[2,pi/2]:[4,pi]:[0.5,-(pi)/2]
633
634&**;=
635(2,0):(3,0):(8,0)
636(3,0):(2,0):(9,0)
637(2,3):(4,0):(-119,-120)
638(0,0):(1,0):(0,0)
639(0,0):(2,3):(0,0)
640(1,0):(0,0):(1,0)
641(1,0):(1,0):(1,0)
642(1,0):(2,3):(1,0)
643(2,3):(0,0):(1,0)
644(2,3):(1,0):(2,3)
645(0,0):(0,0):(1,0)
646
647&Re
648(3,4):3
649(-3,4):-3
650[1,pi/2]:0
651
652&Im
653(3,4):4
654(3,-4):-4
655[1,pi/2]:1
656
657&abs
658(3,4):5
659(-3,4):5
660
661&arg
662[2,0]:0
663[-2,0]:pi
664
665&~
666(4,5):(4,-5)
667(-3,4):(-3,-4)
668[2,pi/2]:[2,-(pi)/2]
669
670&<
671(3,4):(1,2):0
672(3,4):(3,2):0
673(3,4):(3,8):1
674(4,4):(5,129):1
675
676&==
677(3,4):(4,5):0
678(3,4):(3,5):0
679(3,4):(2,4):0
680(3,4):(3,4):1
681
682&sqrt
683-9:(0,3)
684(-100,0):(0,10)
685(16,-30):(5,-3)
686
687&stringify_cartesian
688(-100,0):"-100"
689(0,1):"i"
690(4,-3):"4-3i"
691(4,0):"4"
692(-4,0):"-4"
693(-2,4):"-2+4i"
694(-2,-1):"-2-i"
695
696&stringify_polar
697[-1, 0]:"[1,pi]"
698[1, pi/3]:"[1,pi/3]"
699[6, -2*pi/3]:"[6,-2pi/3]"
700[0.5, -9*pi/11]:"[0.5,-9pi/11]"
701
702{ (4,3); [3,2]; (-3,4); (0,2); [2,1] }
703
704|'z + ~z':'2*Re(z)'
705|'z - ~z':'2*i*Im(z)'
706|'z * ~z':'abs(z) * abs(z)'
707
708{ (0.5, 0); (-0.5, 0); (2,3); [3,2]; (-3,2); (0,2); 3; 1.2; (-3, 0); (-2, -1); [2,1] }
709
710|'(root(z, 4))[1] ** 4':'z'
711|'(root(z, 5))[3] ** 5':'z'
712|'(root(z, 8))[7] ** 8':'z'
713|'(root(z, 8, 0)) ** 8':'z'
714|'(root(z, 8, 7)) ** 8':'z'
715|'abs(z)':'r'
716|'acot(z)':'acotan(z)'
717|'acsc(z)':'acosec(z)'
718|'acsc(z)':'asin(1 / z)'
719|'asec(z)':'acos(1 / z)'
720|'cbrt(z)':'cbrt(r) * exp(i * t/3)'
721|'cos(acos(z))':'z'
722|'addsq(cos(z), sin(z))':1
723|'cos(z)':'cosh(i*z)'
724|'subsq(cosh(z), sinh(z))':1
725|'cot(acot(z))':'z'
726|'cot(z)':'1 / tan(z)'
727|'cot(z)':'cotan(z)'
728|'csc(acsc(z))':'z'
729|'csc(z)':'1 / sin(z)'
730|'csc(z)':'cosec(z)'
731|'exp(log(z))':'z'
732|'exp(z)':'exp(a) * exp(i * b)'
733|'ln(z)':'log(z)'
734|'log(exp(z))':'z'
735|'log(z)':'log(r) + i*t'
736|'log10(z)':'log(z) / log(10)'
737|'logn(z, 2)':'log(z) / log(2)'
738|'logn(z, 3)':'log(z) / log(3)'
739|'sec(asec(z))':'z'
740|'sec(z)':'1 / cos(z)'
741|'sin(asin(z))':'z'
742|'sin(i * z)':'i * sinh(z)'
743|'sqrt(z) * sqrt(z)':'z'
744|'sqrt(z)':'sqrt(r) * exp(i * t/2)'
745|'tan(atan(z))':'z'
746|'z**z':'exp(z * log(z))'
747
748{ (1,1); [1,0.5]; (-2, -1); 2; -3; (-1,0.5); (0,0.5); 0.5; (2, 0); (-1, -2) }
749
750|'cosh(acosh(z))':'z'
751|'coth(acoth(z))':'z'
752|'coth(z)':'1 / tanh(z)'
753|'coth(z)':'cotanh(z)'
754|'csch(acsch(z))':'z'
755|'csch(z)':'1 / sinh(z)'
756|'csch(z)':'cosech(z)'
757|'sech(asech(z))':'z'
758|'sech(z)':'1 / cosh(z)'
759|'sinh(asinh(z))':'z'
760|'tanh(atanh(z))':'z'
761
762{ (0.2,-0.4); [1,0.5]; -1.2; (-1,0.5); 0.5; (1.1, 0) }
763
764|'acos(cos(z)) ** 2':'z * z'
765|'acosh(cosh(z)) ** 2':'z * z'
766|'acoth(z)':'acotanh(z)'
767|'acoth(z)':'atanh(1 / z)'
768|'acsch(z)':'acosech(z)'
769|'acsch(z)':'asinh(1 / z)'
770|'asech(z)':'acosh(1 / z)'
771|'asin(sin(z))':'z'
772|'asinh(sinh(z))':'z'
773|'atan(tan(z))':'z'
774|'atanh(tanh(z))':'z'
775
776&log
777(-2.0,0):(   0.69314718055995,  3.14159265358979)
778(-1.0,0):(   0               ,  3.14159265358979)
779(-0.5,0):(  -0.69314718055995,  3.14159265358979)
780( 0.5,0):(  -0.69314718055995,  0               )
781( 1.0,0):(   0               ,  0               )
782( 2.0,0):(   0.69314718055995,  0               )
783
784&log
785( 2, 3):(    1.28247467873077,  0.98279372324733)
786(-2, 3):(    1.28247467873077,  2.15879893034246)
787(-2,-3):(    1.28247467873077, -2.15879893034246)
788( 2,-3):(    1.28247467873077, -0.98279372324733)
789
790&sin
791(-2.0,0):(  -0.90929742682568,  0               )
792(-1.0,0):(  -0.84147098480790,  0               )
793(-0.5,0):(  -0.47942553860420,  0               )
794( 0.0,0):(   0               ,  0               )
795( 0.5,0):(   0.47942553860420,  0               )
796( 1.0,0):(   0.84147098480790,  0               )
797( 2.0,0):(   0.90929742682568,  0               )
798
799&sin
800( 2, 3):(  9.15449914691143, -4.16890695996656)
801(-2, 3):( -9.15449914691143, -4.16890695996656)
802(-2,-3):( -9.15449914691143,  4.16890695996656)
803( 2,-3):(  9.15449914691143,  4.16890695996656)
804
805&cos
806(-2.0,0):(  -0.41614683654714,  0               )
807(-1.0,0):(   0.54030230586814,  0               )
808(-0.5,0):(   0.87758256189037,  0               )
809( 0.0,0):(   1               ,  0               )
810( 0.5,0):(   0.87758256189037,  0               )
811( 1.0,0):(   0.54030230586814,  0               )
812( 2.0,0):(  -0.41614683654714,  0               )
813
814&cos
815( 2, 3):( -4.18962569096881, -9.10922789375534)
816(-2, 3):( -4.18962569096881,  9.10922789375534)
817(-2,-3):( -4.18962569096881, -9.10922789375534)
818( 2,-3):( -4.18962569096881,  9.10922789375534)
819
820&tan
821(-2.0,0):(   2.18503986326152,  0               )
822(-1.0,0):(  -1.55740772465490,  0               )
823(-0.5,0):(  -0.54630248984379,  0               )
824( 0.0,0):(   0               ,  0               )
825( 0.5,0):(   0.54630248984379,  0               )
826( 1.0,0):(   1.55740772465490,  0               )
827( 2.0,0):(  -2.18503986326152,  0               )
828
829&tan
830( 2, 3):( -0.00376402564150,  1.00323862735361)
831(-2, 3):(  0.00376402564150,  1.00323862735361)
832(-2,-3):(  0.00376402564150, -1.00323862735361)
833( 2,-3):( -0.00376402564150, -1.00323862735361)
834
835&sec
836(-2.0,0):(  -2.40299796172238,  0               )
837(-1.0,0):(   1.85081571768093,  0               )
838(-0.5,0):(   1.13949392732455,  0               )
839( 0.0,0):(   1               ,  0               )
840( 0.5,0):(   1.13949392732455,  0               )
841( 1.0,0):(   1.85081571768093,  0               )
842( 2.0,0):(  -2.40299796172238,  0               )
843
844&sec
845( 2, 3):( -0.04167496441114,  0.09061113719624)
846(-2, 3):( -0.04167496441114, -0.09061113719624)
847(-2,-3):( -0.04167496441114,  0.09061113719624)
848( 2,-3):( -0.04167496441114, -0.09061113719624)
849
850&csc
851(-2.0,0):(  -1.09975017029462,  0               )
852(-1.0,0):(  -1.18839510577812,  0               )
853(-0.5,0):(  -2.08582964293349,  0               )
854( 0.5,0):(   2.08582964293349,  0               )
855( 1.0,0):(   1.18839510577812,  0               )
856( 2.0,0):(   1.09975017029462,  0               )
857
858&csc
859( 2, 3):(  0.09047320975321,  0.04120098628857)
860(-2, 3):( -0.09047320975321,  0.04120098628857)
861(-2,-3):( -0.09047320975321, -0.04120098628857)
862( 2,-3):(  0.09047320975321, -0.04120098628857)
863
864&cot
865(-2.0,0):(   0.45765755436029,  0               )
866(-1.0,0):(  -0.64209261593433,  0               )
867(-0.5,0):(  -1.83048772171245,  0               )
868( 0.5,0):(   1.83048772171245,  0               )
869( 1.0,0):(   0.64209261593433,  0               )
870( 2.0,0):(  -0.45765755436029,  0               )
871
872&cot
873( 2, 3):( -0.00373971037634, -0.99675779656936)
874(-2, 3):(  0.00373971037634, -0.99675779656936)
875(-2,-3):(  0.00373971037634,  0.99675779656936)
876( 2,-3):( -0.00373971037634,  0.99675779656936)
877
878&asin
879(-2.0,0):(  -1.57079632679490,  1.31695789692482)
880(-1.0,0):(  -1.57079632679490,  0               )
881(-0.5,0):(  -0.52359877559830,  0               )
882( 0.0,0):(   0               ,  0               )
883( 0.5,0):(   0.52359877559830,  0               )
884( 1.0,0):(   1.57079632679490,  0               )
885( 2.0,0):(   1.57079632679490, -1.31695789692482)
886
887&asin
888( 2, 3):(  0.57065278432110,  1.98338702991654)
889(-2, 3):( -0.57065278432110,  1.98338702991654)
890(-2,-3):( -0.57065278432110, -1.98338702991654)
891( 2,-3):(  0.57065278432110, -1.98338702991654)
892
893&acos
894(-2.0,0):(   3.14159265358979, -1.31695789692482)
895(-1.0,0):(   3.14159265358979,  0               )
896(-0.5,0):(   2.09439510239320,  0               )
897( 0.0,0):(   1.57079632679490,  0               )
898( 0.5,0):(   1.04719755119660,  0               )
899( 1.0,0):(   0               ,  0               )
900( 2.0,0):(   0               ,  1.31695789692482)
901
902&acos
903( 2, 3):(  1.00014354247380, -1.98338702991654)
904(-2, 3):(  2.14144911111600, -1.98338702991654)
905(-2,-3):(  2.14144911111600,  1.98338702991654)
906( 2,-3):(  1.00014354247380,  1.98338702991654)
907
908&atan
909(-2.0,0):(  -1.10714871779409,  0               )
910(-1.0,0):(  -0.78539816339745,  0               )
911(-0.5,0):(  -0.46364760900081,  0               )
912( 0.0,0):(   0               ,  0               )
913( 0.5,0):(   0.46364760900081,  0               )
914( 1.0,0):(   0.78539816339745,  0               )
915( 2.0,0):(   1.10714871779409,  0               )
916
917&atan
918( 2, 3):(  1.40992104959658,  0.22907268296854)
919(-2, 3):( -1.40992104959658,  0.22907268296854)
920(-2,-3):( -1.40992104959658, -0.22907268296854)
921( 2,-3):(  1.40992104959658, -0.22907268296854)
922
923&asec
924(-2.0,0):(   2.09439510239320,  0               )
925(-1.0,0):(   3.14159265358979,  0               )
926(-0.5,0):(   3.14159265358979, -1.31695789692482)
927( 0.5,0):(   0               ,  1.31695789692482)
928( 1.0,0):(   0               ,  0               )
929( 2.0,0):(   1.04719755119660,  0               )
930
931&asec
932( 2, 3):(  1.42041072246703,  0.23133469857397)
933(-2, 3):(  1.72118193112276,  0.23133469857397)
934(-2,-3):(  1.72118193112276, -0.23133469857397)
935( 2,-3):(  1.42041072246703, -0.23133469857397)
936
937&acsc
938(-2.0,0):(  -0.52359877559830,  0               )
939(-1.0,0):(  -1.57079632679490,  0               )
940(-0.5,0):(  -1.57079632679490,  1.31695789692482)
941( 0.5,0):(   1.57079632679490, -1.31695789692482)
942( 1.0,0):(   1.57079632679490,  0               )
943( 2.0,0):(   0.52359877559830,  0               )
944
945&acsc
946( 2, 3):(  0.15038560432786, -0.23133469857397)
947(-2, 3):( -0.15038560432786, -0.23133469857397)
948(-2,-3):( -0.15038560432786,  0.23133469857397)
949( 2,-3):(  0.15038560432786,  0.23133469857397)
950
951&acot
952(-2.0,0):(  -0.46364760900081,  0               )
953(-1.0,0):(  -0.78539816339745,  0               )
954(-0.5,0):(  -1.10714871779409,  0               )
955( 0.5,0):(   1.10714871779409,  0               )
956( 1.0,0):(   0.78539816339745,  0               )
957( 2.0,0):(   0.46364760900081,  0               )
958
959&acot
960( 2, 3):(  0.16087527719832, -0.22907268296854)
961(-2, 3):( -0.16087527719832, -0.22907268296854)
962(-2,-3):( -0.16087527719832,  0.22907268296854)
963( 2,-3):(  0.16087527719832,  0.22907268296854)
964
965&sinh
966(-2.0,0):(  -3.62686040784702,  0               )
967(-1.0,0):(  -1.17520119364380,  0               )
968(-0.5,0):(  -0.52109530549375,  0               )
969( 0.0,0):(   0               ,  0               )
970( 0.5,0):(   0.52109530549375,  0               )
971( 1.0,0):(   1.17520119364380,  0               )
972( 2.0,0):(   3.62686040784702,  0               )
973
974&sinh
975( 2, 3):( -3.59056458998578,  0.53092108624852)
976(-2, 3):(  3.59056458998578,  0.53092108624852)
977(-2,-3):(  3.59056458998578, -0.53092108624852)
978( 2,-3):( -3.59056458998578, -0.53092108624852)
979
980&cosh
981(-2.0,0):(   3.76219569108363,  0               )
982(-1.0,0):(   1.54308063481524,  0               )
983(-0.5,0):(   1.12762596520638,  0               )
984( 0.0,0):(   1               ,  0               )
985( 0.5,0):(   1.12762596520638,  0               )
986( 1.0,0):(   1.54308063481524,  0               )
987( 2.0,0):(   3.76219569108363,  0               )
988
989&cosh
990( 2, 3):( -3.72454550491532,  0.51182256998738)
991(-2, 3):( -3.72454550491532, -0.51182256998738)
992(-2,-3):( -3.72454550491532,  0.51182256998738)
993( 2,-3):( -3.72454550491532, -0.51182256998738)
994
995&tanh
996(-2.0,0):(  -0.96402758007582,  0               )
997(-1.0,0):(  -0.76159415595576,  0               )
998(-0.5,0):(  -0.46211715726001,  0               )
999( 0.0,0):(   0               ,  0               )
1000( 0.5,0):(   0.46211715726001,  0               )
1001( 1.0,0):(   0.76159415595576,  0               )
1002( 2.0,0):(   0.96402758007582,  0               )
1003
1004&tanh
1005( 2, 3):(  0.96538587902213, -0.00988437503832)
1006(-2, 3):( -0.96538587902213, -0.00988437503832)
1007(-2,-3):( -0.96538587902213,  0.00988437503832)
1008( 2,-3):(  0.96538587902213,  0.00988437503832)
1009
1010&sech
1011(-2.0,0):(   0.26580222883408,  0               )
1012(-1.0,0):(   0.64805427366389,  0               )
1013(-0.5,0):(   0.88681888397007,  0               )
1014( 0.0,0):(   1               ,  0               )
1015( 0.5,0):(   0.88681888397007,  0               )
1016( 1.0,0):(   0.64805427366389,  0               )
1017( 2.0,0):(   0.26580222883408,  0               )
1018
1019&sech
1020( 2, 3):( -0.26351297515839, -0.03621163655877)
1021(-2, 3):( -0.26351297515839,  0.03621163655877)
1022(-2,-3):( -0.26351297515839, -0.03621163655877)
1023( 2,-3):( -0.26351297515839,  0.03621163655877)
1024
1025&csch
1026(-2.0,0):(  -0.27572056477178,  0               )
1027(-1.0,0):(  -0.85091812823932,  0               )
1028(-0.5,0):(  -1.91903475133494,  0               )
1029( 0.5,0):(   1.91903475133494,  0               )
1030( 1.0,0):(   0.85091812823932,  0               )
1031( 2.0,0):(   0.27572056477178,  0               )
1032
1033&csch
1034( 2, 3):( -0.27254866146294, -0.04030057885689)
1035(-2, 3):(  0.27254866146294, -0.04030057885689)
1036(-2,-3):(  0.27254866146294,  0.04030057885689)
1037( 2,-3):( -0.27254866146294,  0.04030057885689)
1038
1039&coth
1040(-2.0,0):(  -1.03731472072755,  0               )
1041(-1.0,0):(  -1.31303528549933,  0               )
1042(-0.5,0):(  -2.16395341373865,  0               )
1043( 0.5,0):(   2.16395341373865,  0               )
1044( 1.0,0):(   1.31303528549933,  0               )
1045( 2.0,0):(   1.03731472072755,  0               )
1046
1047&coth
1048( 2, 3):(  1.03574663776500,  0.01060478347034)
1049(-2, 3):( -1.03574663776500,  0.01060478347034)
1050(-2,-3):( -1.03574663776500, -0.01060478347034)
1051( 2,-3):(  1.03574663776500, -0.01060478347034)
1052
1053&asinh
1054(-2.0,0):(  -1.44363547517881,  0               )
1055(-1.0,0):(  -0.88137358701954,  0               )
1056(-0.5,0):(  -0.48121182505960,  0               )
1057( 0.0,0):(   0               ,  0               )
1058( 0.5,0):(   0.48121182505960,  0               )
1059( 1.0,0):(   0.88137358701954,  0               )
1060( 2.0,0):(   1.44363547517881,  0               )
1061
1062&asinh
1063( 2, 3):(  1.96863792579310,  0.96465850440760)
1064(-2, 3):( -1.96863792579310,  0.96465850440761)
1065(-2,-3):( -1.96863792579310, -0.96465850440761)
1066( 2,-3):(  1.96863792579310, -0.96465850440760)
1067
1068&acosh
1069(-2.0,0):(   1.31695789692482,  3.14159265358979)
1070(-1.0,0):(   0,                 3.14159265358979)
1071(-0.5,0):(   0,                 2.09439510239320)
1072( 0.0,0):(   0,                 1.57079632679490)
1073( 0.5,0):(   0,                 1.04719755119660)
1074( 1.0,0):(   0               ,  0               )
1075( 2.0,0):(   1.31695789692482,  0               )
1076
1077&acosh
1078( 2, 3):(  1.98338702991654,  1.00014354247380)
1079(-2, 3):(  1.98338702991653,  2.14144911111600)
1080(-2,-3):(  1.98338702991653, -2.14144911111600)
1081( 2,-3):(  1.98338702991654, -1.00014354247380)
1082
1083&atanh
1084(-2.0,0):(  -0.54930614433405,  1.57079632679490)
1085(-0.5,0):(  -0.54930614433405,  0               )
1086( 0.0,0):(   0               ,  0               )
1087( 0.5,0):(   0.54930614433405,  0               )
1088( 2.0,0):(   0.54930614433405,  1.57079632679490)
1089
1090&atanh
1091( 2, 3):(  0.14694666622553,  1.33897252229449)
1092(-2, 3):( -0.14694666622553,  1.33897252229449)
1093(-2,-3):( -0.14694666622553, -1.33897252229449)
1094( 2,-3):(  0.14694666622553, -1.33897252229449)
1095
1096&asech
1097(-2.0,0):(   0               , 2.09439510239320)
1098(-1.0,0):(   0               , 3.14159265358979)
1099(-0.5,0):(   1.31695789692482, 3.14159265358979)
1100( 0.5,0):(   1.31695789692482, 0               )
1101( 1.0,0):(   0               , 0               )
1102( 2.0,0):(   0               , 1.04719755119660)
1103
1104&asech
1105( 2, 3):(  0.23133469857397, -1.42041072246703)
1106(-2, 3):(  0.23133469857397, -1.72118193112276)
1107(-2,-3):(  0.23133469857397,  1.72118193112276)
1108( 2,-3):(  0.23133469857397,  1.42041072246703)
1109
1110&acsch
1111(-2.0,0):(  -0.48121182505960, 0               )
1112(-1.0,0):(  -0.88137358701954, 0               )
1113(-0.5,0):(  -1.44363547517881, 0               )
1114( 0.5,0):(   1.44363547517881, 0               )
1115( 1.0,0):(   0.88137358701954, 0               )
1116( 2.0,0):(   0.48121182505960, 0               )
1117
1118&acsch
1119( 2, 3):(  0.15735549884499, -0.22996290237721)
1120(-2, 3):( -0.15735549884499, -0.22996290237721)
1121(-2,-3):( -0.15735549884499,  0.22996290237721)
1122( 2,-3):(  0.15735549884499,  0.22996290237721)
1123
1124&acoth
1125(-2.0,0):(  -0.54930614433405, 0               )
1126(-0.5,0):(  -0.54930614433405, 1.57079632679490)
1127( 0.5,0):(   0.54930614433405, 1.57079632679490)
1128( 2.0,0):(   0.54930614433405, 0               )
1129
1130&acoth
1131( 2, 3):(  0.14694666622553, -0.23182380450040)
1132(-2, 3):( -0.14694666622553, -0.23182380450040)
1133(-2,-3):( -0.14694666622553,  0.23182380450040)
1134( 2,-3):(  0.14694666622553,  0.23182380450040)
1135
1136# eof
1137