2 # Complex numbers and associated mathematical functions
3 # -- Raphael Manfredi Since Sep 1996
4 # -- Jarkko Hietaniemi Since Mar 1997
5 # -- Daniel S. Lewart Since Sep 1997
10 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $Inf);
15 unless ($^O eq 'unicosmk') {
17 # We do want an arithmetic overflow, Inf INF inf Infinity:.
18 undef $Inf unless eval <<'EOE' and $Inf =~ /^inf(?:inity)?$/i;
19 local $SIG{FPE} = sub {die};
23 if (!defined $Inf) { # Try a different method
24 undef $Inf unless eval <<'EOE' and $Inf =~ /^inf(?:inity)?$/i;
25 local $SIG{FPE} = sub {die};
27 $Inf = $t + "1e99999999999999999999999999999999";
30 $! = $e; # Clear ERANGE.
32 $Inf = "Inf" if !defined $Inf || !($Inf > 0); # Desperation.
40 # Regular expression for floating point numbers.
41 # These days we could use Scalar::Util::lln(), I guess.
42 my $gre = qr'\s*([\+\-]?(?:(?:(?:\d+(?:_\d+)*(?:\.\d*(?:_\d+)*)?|\.\d+(?:_\d+)*)(?:[eE][\+\-]?\d+(?:_\d+)*)?))|inf)'i;
51 csc cosec sec cot cotan
53 acsc acosec asec acot acotan
55 csch cosech sech coth cotanh
57 acsch acosech asech acoth acotanh
69 my @pi = qw(pi pi2 pi4 pip2 pip4);
85 '<=>' => \&_spaceship,
102 my %DISPLAY_FORMAT = ('style' => 'cartesian',
103 'polar_pretty_print' => 1);
104 my $eps = 1e-14; # Epsilon
107 # Object attributes (internal):
108 # cartesian [real, imaginary] -- cartesian form
109 # polar [rho, theta] -- polar form
110 # c_dirty cartesian form not up-to-date
111 # p_dirty polar form not up-to-date
112 # display display format (package's global when not set)
117 # Die on bad *make() arguments.
120 die "@{[(caller(1))[3]]}: Cannot take $_[0] of '$_[1]'.\n";
127 if ($arg =~ /^$gre$/) {
129 } elsif ($arg =~ /^(?:$gre)?$gre\s*i\s*$/) {
130 ($p, $q) = ($1 || 0, $2);
131 } elsif ($arg =~ /^\s*\(\s*$gre\s*(?:,\s*$gre\s*)?\)\s*$/) {
132 ($p, $q) = ($1, $2 || 0);
137 $p =~ s/^(-?)inf$/"${1}9**9**9"/e;
139 $q =~ s/^(-?)inf$/"${1}9**9**9"/e;
149 if ($arg =~ /^\s*\[\s*$gre\s*(?:,\s*$gre\s*)?\]\s*$/) {
150 ($p, $q) = ($1, $2 || 0);
151 } elsif ($arg =~ m!^\s*\[\s*$gre\s*(?:,\s*([-+]?\d*\s*)?pi(?:/\s*(\d+))?\s*)?\]\s*$!) {
152 ($p, $q) = ($1, ($2 eq '-' ? -1 : ($2 || 1)) * pi() / ($3 || 1));
153 } elsif ($arg =~ /^\s*\[\s*$gre\s*\]\s*$/) {
155 } elsif ($arg =~ /^\s*$gre\s*$/) {
162 $p =~ s/^(-?)inf$/"${1}9**9**9"/e;
163 $q =~ s/^(-?)inf$/"${1}9**9**9"/e;
172 # Create a new complex number (cartesian form)
175 my $self = bless {}, shift;
180 return (ref $self)->emake($_[0])
181 if ($_[0] =~ /^\s*\[/);
182 ($re, $im) = _make($_[0]);
187 _cannot_make("real part", $re) unless $re =~ /^$gre$/;
190 _cannot_make("imaginary part", $im) unless $im =~ /^$gre$/;
191 $self->_set_cartesian([$re, $im ]);
192 $self->display_format('cartesian');
200 # Create a new complex number (exponential form)
203 my $self = bless {}, shift;
206 ($rho, $theta) = (0, 0);
208 return (ref $self)->make($_[0])
209 if ($_[0] =~ /^\s*\(/ || $_[0] =~ /i\s*$/);
210 ($rho, $theta) = _emake($_[0]);
214 if (defined $rho && defined $theta) {
217 $theta = ($theta <= 0) ? $theta + pi() : $theta - pi();
221 _cannot_make("rho", $rho) unless $rho =~ /^$gre$/;
224 _cannot_make("theta", $theta) unless $theta =~ /^$gre$/;
225 $self->_set_polar([$rho, $theta]);
226 $self->display_format('polar');
231 sub new { &make } # For backward compatibility only.
236 # Creates a complex number from a (re, im) tuple.
237 # This avoids the burden of writing Math::Complex->make(re, im).
240 return __PACKAGE__->make(@_);
246 # Creates a complex number from a (rho, theta) tuple.
247 # This avoids the burden of writing Math::Complex->emake(rho, theta).
250 return __PACKAGE__->emake(@_);
256 # The number defined as pi = 180 degrees
258 sub pi () { 4 * CORE::atan2(1, 1) }
265 sub pi2 () { 2 * pi }
270 # The full circle twice.
272 sub pi4 () { 4 * pi }
279 sub pip2 () { pi / 2 }
286 sub pip4 () { pi / 4 }
293 sub _uplog10 () { 1 / CORE::log(10) }
298 # The number defined as i*i = -1;
303 $i->{'cartesian'} = [0, 1];
304 $i->{'polar'} = [1, pip2];
315 sub _ip2 () { i / 2 }
318 # Attribute access/set routines
321 sub _cartesian {$_[0]->{c_dirty} ?
322 $_[0]->_update_cartesian : $_[0]->{'cartesian'}}
323 sub _polar {$_[0]->{p_dirty} ?
324 $_[0]->_update_polar : $_[0]->{'polar'}}
326 sub _set_cartesian { $_[0]->{p_dirty}++; $_[0]->{c_dirty} = 0;
327 $_[0]->{'cartesian'} = $_[1] }
328 sub _set_polar { $_[0]->{c_dirty}++; $_[0]->{p_dirty} = 0;
329 $_[0]->{'polar'} = $_[1] }
332 # ->_update_cartesian
334 # Recompute and return the cartesian form, given accurate polar form.
336 sub _update_cartesian {
338 my ($r, $t) = @{$self->{'polar'}};
339 $self->{c_dirty} = 0;
340 return $self->{'cartesian'} = [$r * CORE::cos($t), $r * CORE::sin($t)];
347 # Recompute and return the polar form, given accurate cartesian form.
351 my ($x, $y) = @{$self->{'cartesian'}};
352 $self->{p_dirty} = 0;
353 return $self->{'polar'} = [0, 0] if $x == 0 && $y == 0;
354 return $self->{'polar'} = [CORE::sqrt($x*$x + $y*$y),
355 CORE::atan2($y, $x)];
364 my ($z1, $z2, $regular) = @_;
365 my ($re1, $im1) = @{$z1->_cartesian};
366 $z2 = cplx($z2) unless ref $z2;
367 my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
368 unless (defined $regular) {
369 $z1->_set_cartesian([$re1 + $re2, $im1 + $im2]);
372 return (ref $z1)->make($re1 + $re2, $im1 + $im2);
381 my ($z1, $z2, $inverted) = @_;
382 my ($re1, $im1) = @{$z1->_cartesian};
383 $z2 = cplx($z2) unless ref $z2;
384 my ($re2, $im2) = @{$z2->_cartesian};
385 unless (defined $inverted) {
386 $z1->_set_cartesian([$re1 - $re2, $im1 - $im2]);
390 (ref $z1)->make($re2 - $re1, $im2 - $im1) :
391 (ref $z1)->make($re1 - $re2, $im1 - $im2);
401 my ($z1, $z2, $regular) = @_;
402 if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
403 # if both polar better use polar to avoid rounding errors
404 my ($r1, $t1) = @{$z1->_polar};
405 my ($r2, $t2) = @{$z2->_polar};
407 if ($t > pi()) { $t -= pi2 }
408 elsif ($t <= -pi()) { $t += pi2 }
409 unless (defined $regular) {
410 $z1->_set_polar([$r1 * $r2, $t]);
413 return (ref $z1)->emake($r1 * $r2, $t);
415 my ($x1, $y1) = @{$z1->_cartesian};
417 my ($x2, $y2) = @{$z2->_cartesian};
418 return (ref $z1)->make($x1*$x2-$y1*$y2, $x1*$y2+$y1*$x2);
420 return (ref $z1)->make($x1*$z2, $y1*$z2);
428 # Die on division by zero.
431 my $mess = "$_[0]: Division by zero.\n";
434 $mess .= "(Because in the definition of $_[0], the divisor ";
435 $mess .= "$_[1] " unless ("$_[1]" eq '0');
441 $mess .= "Died at $up[1] line $up[2].\n";
452 my ($z1, $z2, $inverted) = @_;
453 if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
454 # if both polar better use polar to avoid rounding errors
455 my ($r1, $t1) = @{$z1->_polar};
456 my ($r2, $t2) = @{$z2->_polar};
459 _divbyzero "$z2/0" if ($r1 == 0);
461 if ($t > pi()) { $t -= pi2 }
462 elsif ($t <= -pi()) { $t += pi2 }
463 return (ref $z1)->emake($r2 / $r1, $t);
465 _divbyzero "$z1/0" if ($r2 == 0);
467 if ($t > pi()) { $t -= pi2 }
468 elsif ($t <= -pi()) { $t += pi2 }
469 return (ref $z1)->emake($r1 / $r2, $t);
474 ($x2, $y2) = @{$z1->_cartesian};
475 $d = $x2*$x2 + $y2*$y2;
476 _divbyzero "$z2/0" if $d == 0;
477 return (ref $z1)->make(($x2*$z2)/$d, -($y2*$z2)/$d);
479 my ($x1, $y1) = @{$z1->_cartesian};
481 ($x2, $y2) = @{$z2->_cartesian};
482 $d = $x2*$x2 + $y2*$y2;
483 _divbyzero "$z1/0" if $d == 0;
484 my $u = ($x1*$x2 + $y1*$y2)/$d;
485 my $v = ($y1*$x2 - $x1*$y2)/$d;
486 return (ref $z1)->make($u, $v);
488 _divbyzero "$z1/0" if $z2 == 0;
489 return (ref $z1)->make($x1/$z2, $y1/$z2);
498 # Computes z1**z2 = exp(z2 * log z1)).
501 my ($z1, $z2, $inverted) = @_;
503 return 1 if $z1 == 0 || $z2 == 1;
504 return 0 if $z2 == 0 && Re($z1) > 0;
506 return 1 if $z2 == 0 || $z1 == 1;
507 return 0 if $z1 == 0 && Re($z2) > 0;
509 my $w = $inverted ? &exp($z1 * &log($z2))
510 : &exp($z2 * &log($z1));
511 # If both arguments cartesian, return cartesian, else polar.
512 return $z1->{c_dirty} == 0 &&
513 (not ref $z2 or $z2->{c_dirty} == 0) ?
514 cplx(@{$w->_cartesian}) : $w;
520 # Computes z1 <=> z2.
521 # Sorts on the real part first, then on the imaginary part. Thus 2-4i < 3+8i.
524 my ($z1, $z2, $inverted) = @_;
525 my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
526 my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
527 my $sgn = $inverted ? -1 : 1;
528 return $sgn * ($re1 <=> $re2) if $re1 != $re2;
529 return $sgn * ($im1 <=> $im2);
537 # (Required in addition to _spaceship() because of NaNs.)
539 my ($z1, $z2, $inverted) = @_;
540 my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
541 my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
542 return $re1 == $re2 && $im1 == $im2 ? 1 : 0;
553 my ($r, $t) = @{$z->_polar};
554 $t = ($t <= 0) ? $t + pi : $t - pi;
555 return (ref $z)->emake($r, $t);
557 my ($re, $im) = @{$z->_cartesian};
558 return (ref $z)->make(-$re, -$im);
564 # Compute complex's _conjugate.
569 my ($r, $t) = @{$z->_polar};
570 return (ref $z)->emake($r, -$t);
572 my ($re, $im) = @{$z->_cartesian};
573 return (ref $z)->make($re, -$im);
579 # Compute or set complex's norm (rho).
587 return CORE::abs($z);
591 $z->{'polar'} = [ $rho, ${$z->_polar}[1] ];
596 return ${$z->_polar}[0];
603 if ($$theta > pi()) { $$theta -= pi2 }
604 elsif ($$theta <= -pi()) { $$theta += pi2 }
610 # Compute or set complex's argument (theta).
613 my ($z, $theta) = @_;
614 return $z unless ref $z;
615 if (defined $theta) {
617 $z->{'polar'} = [ ${$z->_polar}[0], $theta ];
621 $theta = ${$z->_polar}[1];
632 # It is quite tempting to use wantarray here so that in list context
633 # sqrt() would return the two solutions. This, however, would
636 # print "sqrt(z) = ", sqrt($z), "\n";
638 # The two values would be printed side by side without no intervening
639 # whitespace, quite confusing.
640 # Therefore if you want the two solutions use the root().
644 my ($re, $im) = ref $z ? @{$z->_cartesian} : ($z, 0);
645 return $re < 0 ? cplx(0, CORE::sqrt(-$re)) : CORE::sqrt($re)
647 my ($r, $t) = @{$z->_polar};
648 return (ref $z)->emake(CORE::sqrt($r), $t/2);
654 # Compute cbrt(z) (cubic root).
656 # Why are we not returning three values? The same answer as for sqrt().
661 -CORE::exp(CORE::log(-$z)/3) :
662 ($z > 0 ? CORE::exp(CORE::log($z)/3): 0)
664 my ($r, $t) = @{$z->_polar};
666 return (ref $z)->emake(CORE::exp(CORE::log($r)/3), $t/3);
675 my $mess = "Root '$_[0]' illegal, root rank must be positive integer.\n";
679 $mess .= "Died at $up[1] line $up[2].\n";
687 # Computes all nth root for z, returning an array whose size is n.
688 # `n' must be a positive integer.
690 # The roots are given by (for k = 0..n-1):
692 # z^(1/n) = r^(1/n) (cos ((t+2 k pi)/n) + i sin ((t+2 k pi)/n))
695 my ($z, $n, $k) = @_;
696 _rootbad($n) if ($n < 1 or int($n) != $n);
697 my ($r, $t) = ref $z ?
698 @{$z->_polar} : (CORE::abs($z), $z >= 0 ? 0 : pi);
699 my $theta_inc = pi2 / $n;
700 my $rho = $r ** (1/$n);
701 my $cartesian = ref $z && $z->{c_dirty} == 0;
704 for (my $i = 0, my $theta = $t / $n;
706 $i++, $theta += $theta_inc) {
707 my $w = cplxe($rho, $theta);
708 # Yes, $cartesian is loop invariant.
709 push @root, $cartesian ? cplx(@{$w->_cartesian}) : $w;
713 my $w = cplxe($rho, $t / $n + $k * $theta_inc);
714 return $cartesian ? cplx(@{$w->_cartesian}) : $w;
721 # Return or set Re(z).
725 return $z unless ref $z;
727 $z->{'cartesian'} = [ $Re, ${$z->_cartesian}[1] ];
731 return ${$z->_cartesian}[0];
738 # Return or set Im(z).
742 return 0 unless ref $z;
744 $z->{'cartesian'} = [ ${$z->_cartesian}[0], $Im ];
748 return ${$z->_cartesian}[1];
755 # Return or set rho(w).
758 Math::Complex::abs(@_);
764 # Return or set theta(w).
767 Math::Complex::arg(@_);
777 my ($x, $y) = @{$z->_cartesian};
778 return (ref $z)->emake(CORE::exp($x), $y);
784 # Die on logarithm of zero.
787 my $mess = "$_[0]: Logarithm of zero.\n";
790 $mess .= "(Because in the definition of $_[0], the argument ";
791 $mess .= "$_[1] " unless ($_[1] eq '0');
797 $mess .= "Died at $up[1] line $up[2].\n";
810 _logofzero("log") if $z == 0;
811 return $z > 0 ? CORE::log($z) : cplx(CORE::log(-$z), pi);
813 my ($r, $t) = @{$z->_polar};
814 _logofzero("log") if $r == 0;
815 if ($t > pi()) { $t -= pi2 }
816 elsif ($t <= -pi()) { $t += pi2 }
817 return (ref $z)->make(CORE::log($r), $t);
825 sub ln { Math::Complex::log(@_) }
834 return Math::Complex::log($_[0]) * _uplog10;
840 # Compute logn(z,n) = log(z) / log(n)
844 $z = cplx($z, 0) unless ref $z;
845 my $logn = $LOGN{$n};
846 $logn = $LOGN{$n} = CORE::log($n) unless defined $logn; # Cache log(n)
847 return &log($z) / $logn;
853 # Compute cos(z) = (exp(iz) + exp(-iz))/2.
857 return CORE::cos($z) unless ref $z;
858 my ($x, $y) = @{$z->_cartesian};
859 my $ey = CORE::exp($y);
860 my $sx = CORE::sin($x);
861 my $cx = CORE::cos($x);
862 my $ey_1 = $ey ? 1 / $ey : $Inf;
863 return (ref $z)->make($cx * ($ey + $ey_1)/2,
864 $sx * ($ey_1 - $ey)/2);
870 # Compute sin(z) = (exp(iz) - exp(-iz))/2.
874 return CORE::sin($z) unless ref $z;
875 my ($x, $y) = @{$z->_cartesian};
876 my $ey = CORE::exp($y);
877 my $sx = CORE::sin($x);
878 my $cx = CORE::cos($x);
879 my $ey_1 = $ey ? 1 / $ey : $Inf;
880 return (ref $z)->make($sx * ($ey + $ey_1)/2,
881 $cx * ($ey - $ey_1)/2);
887 # Compute tan(z) = sin(z) / cos(z).
892 _divbyzero "tan($z)", "cos($z)" if $cz == 0;
893 return &sin($z) / $cz;
899 # Computes the secant sec(z) = 1 / cos(z).
904 _divbyzero "sec($z)", "cos($z)" if ($cz == 0);
911 # Computes the cosecant csc(z) = 1 / sin(z).
916 _divbyzero "csc($z)", "sin($z)" if ($sz == 0);
925 sub cosec { Math::Complex::csc(@_) }
930 # Computes cot(z) = cos(z) / sin(z).
935 _divbyzero "cot($z)", "sin($z)" if ($sz == 0);
936 return &cos($z) / $sz;
944 sub cotan { Math::Complex::cot(@_) }
949 # Computes the arc cosine acos(z) = -i log(z + sqrt(z*z-1)).
953 return CORE::atan2(CORE::sqrt(1-$z*$z), $z)
954 if (! ref $z) && CORE::abs($z) <= 1;
955 $z = cplx($z, 0) unless ref $z;
956 my ($x, $y) = @{$z->_cartesian};
957 return 0 if $x == 1 && $y == 0;
958 my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
959 my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
960 my $alpha = ($t1 + $t2)/2;
961 my $beta = ($t1 - $t2)/2;
962 $alpha = 1 if $alpha < 1;
963 if ($beta > 1) { $beta = 1 }
964 elsif ($beta < -1) { $beta = -1 }
965 my $u = CORE::atan2(CORE::sqrt(1-$beta*$beta), $beta);
966 my $v = CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
967 $v = -$v if $y > 0 || ($y == 0 && $x < -1);
968 return (ref $z)->make($u, $v);
974 # Computes the arc sine asin(z) = -i log(iz + sqrt(1-z*z)).
978 return CORE::atan2($z, CORE::sqrt(1-$z*$z))
979 if (! ref $z) && CORE::abs($z) <= 1;
980 $z = cplx($z, 0) unless ref $z;
981 my ($x, $y) = @{$z->_cartesian};
982 return 0 if $x == 0 && $y == 0;
983 my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
984 my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
985 my $alpha = ($t1 + $t2)/2;
986 my $beta = ($t1 - $t2)/2;
987 $alpha = 1 if $alpha < 1;
988 if ($beta > 1) { $beta = 1 }
989 elsif ($beta < -1) { $beta = -1 }
990 my $u = CORE::atan2($beta, CORE::sqrt(1-$beta*$beta));
991 my $v = -CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
992 $v = -$v if $y > 0 || ($y == 0 && $x < -1);
993 return (ref $z)->make($u, $v);
999 # Computes the arc tangent atan(z) = i/2 log((i+z) / (i-z)).
1003 return CORE::atan2($z, 1) unless ref $z;
1004 my ($x, $y) = ref $z ? @{$z->_cartesian} : ($z, 0);
1005 return 0 if $x == 0 && $y == 0;
1006 _divbyzero "atan(i)" if ( $z == i);
1007 _logofzero "atan(-i)" if (-$z == i); # -i is a bad file test...
1008 my $log = &log((i + $z) / (i - $z));
1015 # Computes the arc secant asec(z) = acos(1 / z).
1019 _divbyzero "asec($z)", $z if ($z == 0);
1020 return acos(1 / $z);
1026 # Computes the arc cosecant acsc(z) = asin(1 / z).
1030 _divbyzero "acsc($z)", $z if ($z == 0);
1031 return asin(1 / $z);
1039 sub acosec { Math::Complex::acsc(@_) }
1044 # Computes the arc cotangent acot(z) = atan(1 / z)
1048 _divbyzero "acot(0)" if $z == 0;
1049 return ($z >= 0) ? CORE::atan2(1, $z) : CORE::atan2(-1, -$z)
1051 _divbyzero "acot(i)" if ($z - i == 0);
1052 _logofzero "acot(-i)" if ($z + i == 0);
1053 return atan(1 / $z);
1061 sub acotan { Math::Complex::acot(@_) }
1066 # Computes the hyperbolic cosine cosh(z) = (exp(z) + exp(-z))/2.
1072 $ex = CORE::exp($z);
1073 return $ex ? ($ex + 1/$ex)/2 : $Inf;
1075 my ($x, $y) = @{$z->_cartesian};
1076 $ex = CORE::exp($x);
1077 my $ex_1 = $ex ? 1 / $ex : $Inf;
1078 return (ref $z)->make(CORE::cos($y) * ($ex + $ex_1)/2,
1079 CORE::sin($y) * ($ex - $ex_1)/2);
1085 # Computes the hyperbolic sine sinh(z) = (exp(z) - exp(-z))/2.
1091 return 0 if $z == 0;
1092 $ex = CORE::exp($z);
1093 return $ex ? ($ex - 1/$ex)/2 : "-$Inf";
1095 my ($x, $y) = @{$z->_cartesian};
1096 my $cy = CORE::cos($y);
1097 my $sy = CORE::sin($y);
1098 $ex = CORE::exp($x);
1099 my $ex_1 = $ex ? 1 / $ex : $Inf;
1100 return (ref $z)->make(CORE::cos($y) * ($ex - $ex_1)/2,
1101 CORE::sin($y) * ($ex + $ex_1)/2);
1107 # Computes the hyperbolic tangent tanh(z) = sinh(z) / cosh(z).
1112 _divbyzero "tanh($z)", "cosh($z)" if ($cz == 0);
1113 return sinh($z) / $cz;
1119 # Computes the hyperbolic secant sech(z) = 1 / cosh(z).
1124 _divbyzero "sech($z)", "cosh($z)" if ($cz == 0);
1131 # Computes the hyperbolic cosecant csch(z) = 1 / sinh(z).
1136 _divbyzero "csch($z)", "sinh($z)" if ($sz == 0);
1145 sub cosech { Math::Complex::csch(@_) }
1150 # Computes the hyperbolic cotangent coth(z) = cosh(z) / sinh(z).
1155 _divbyzero "coth($z)", "sinh($z)" if $sz == 0;
1156 return cosh($z) / $sz;
1164 sub cotanh { Math::Complex::coth(@_) }
1169 # Computes the arc hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)).
1176 my ($re, $im) = @{$z->_cartesian};
1178 return CORE::log($re + CORE::sqrt($re*$re - 1))
1180 return cplx(0, CORE::atan2(CORE::sqrt(1 - $re*$re), $re))
1181 if CORE::abs($re) < 1;
1183 my $t = &sqrt($z * $z - 1) + $z;
1184 # Try Taylor if looking bad (this usually means that
1185 # $z was large negative, therefore the sqrt is really
1186 # close to abs(z), summing that with z...)
1187 $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
1190 $u->Im(-$u->Im) if $re < 0 && $im == 0;
1191 return $re < 0 ? -$u : $u;
1197 # Computes the arc hyperbolic sine asinh(z) = log(z + sqrt(z*z+1))
1202 my $t = $z + CORE::sqrt($z*$z + 1);
1203 return CORE::log($t) if $t;
1205 my $t = &sqrt($z * $z + 1) + $z;
1206 # Try Taylor if looking bad (this usually means that
1207 # $z was large negative, therefore the sqrt is really
1208 # close to abs(z), summing that with z...)
1209 $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
1217 # Computes the arc hyperbolic tangent atanh(z) = 1/2 log((1+z) / (1-z)).
1222 return CORE::log((1 + $z)/(1 - $z))/2 if CORE::abs($z) < 1;
1225 _divbyzero 'atanh(1)', "1 - $z" if (1 - $z == 0);
1226 _logofzero 'atanh(-1)' if (1 + $z == 0);
1227 return 0.5 * &log((1 + $z) / (1 - $z));
1233 # Computes the hyperbolic arc secant asech(z) = acosh(1 / z).
1237 _divbyzero 'asech(0)', "$z" if ($z == 0);
1238 return acosh(1 / $z);
1244 # Computes the hyperbolic arc cosecant acsch(z) = asinh(1 / z).
1248 _divbyzero 'acsch(0)', $z if ($z == 0);
1249 return asinh(1 / $z);
1255 # Alias for acosh().
1257 sub acosech { Math::Complex::acsch(@_) }
1262 # Computes the arc hyperbolic cotangent acoth(z) = 1/2 log((1+z) / (z-1)).
1266 _divbyzero 'acoth(0)' if ($z == 0);
1268 return CORE::log(($z + 1)/($z - 1))/2 if CORE::abs($z) > 1;
1271 _divbyzero 'acoth(1)', "$z - 1" if ($z - 1 == 0);
1272 _logofzero 'acoth(-1)', "1 + $z" if (1 + $z == 0);
1273 return &log((1 + $z) / ($z - 1)) / 2;
1281 sub acotanh { Math::Complex::acoth(@_) }
1286 # Compute atan(z1/z2), minding the right quadrant.
1289 my ($z1, $z2, $inverted) = @_;
1290 my ($re1, $im1, $re2, $im2);
1292 ($re1, $im1) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
1293 ($re2, $im2) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
1295 ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
1296 ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
1299 # In MATLAB the imaginary parts are ignored.
1300 # warn "atan2: Imaginary parts ignored";
1301 # http://documents.wolfram.com/mathematica/functions/ArcTan
1302 # NOTE: Mathematica ArcTan[x,y] while atan2(y,x)
1303 my $s = $z1 * $z1 + $z2 * $z2;
1304 _divbyzero("atan2") if $s == 0;
1306 my $r = $z2 + $z1 * $i;
1307 return -$i * &log($r / &sqrt( $s ));
1309 return CORE::atan2($re1, $re2);
1316 # Set (get if no argument) the display format for all complex numbers that
1317 # don't happen to have overridden it via ->display_format
1319 # When called as an object method, this actually sets the display format for
1320 # the current object.
1322 # Valid object formats are 'c' and 'p' for cartesian and polar. The first
1323 # letter is used actually, so the type can be fully spelled out for clarity.
1325 sub display_format {
1327 my %display_format = %DISPLAY_FORMAT;
1329 if (ref $self) { # Called as an object method
1330 if (exists $self->{display_format}) {
1331 my %obj = %{$self->{display_format}};
1332 @display_format{keys %obj} = values %obj;
1336 $display_format{style} = shift;
1339 @display_format{keys %new} = values %new;
1342 if (ref $self) { # Called as an object method
1343 $self->{display_format} = { %display_format };
1346 %{$self->{display_format}} :
1347 $self->{display_format}->{style};
1350 # Called as a class method
1351 %DISPLAY_FORMAT = %display_format;
1355 $DISPLAY_FORMAT{style};
1361 # Show nicely formatted complex number under its cartesian or polar form,
1362 # depending on the current display format:
1364 # . If a specific display format has been recorded for this object, use it.
1365 # . Otherwise, use the generic current default for all complex numbers,
1366 # which is a package global variable.
1371 my $style = $z->display_format;
1373 $style = $DISPLAY_FORMAT{style} unless defined $style;
1375 return $z->_stringify_polar if $style =~ /^p/i;
1376 return $z->_stringify_cartesian;
1380 # ->_stringify_cartesian
1382 # Stringify as a cartesian representation 'a+bi'.
1384 sub _stringify_cartesian {
1386 my ($x, $y) = @{$z->_cartesian};
1389 my %format = $z->display_format;
1390 my $format = $format{format};
1393 if ($x =~ /^NaN[QS]?$/i) {
1396 if ($x =~ /^-?$Inf$/oi) {
1399 $re = defined $format ? sprintf($format, $x) : $x;
1407 if ($y =~ /^(NaN[QS]?)$/i) {
1410 if ($y =~ /^-?$Inf$/oi) {
1415 sprintf($format, $y) :
1416 ($y == 1 ? "" : ($y == -1 ? "-" : $y));
1429 } elsif ($y > 0 || $im =~ /^NaN[QS]?i$/i) {
1430 $str .= "+" if defined $re;
1433 } elsif (!defined $re) {
1442 # ->_stringify_polar
1444 # Stringify as a polar representation '[r,t]'.
1446 sub _stringify_polar {
1448 my ($r, $t) = @{$z->_polar};
1451 my %format = $z->display_format;
1452 my $format = $format{format};
1454 if ($t =~ /^NaN[QS]?$/i || $t =~ /^-?$Inf$/oi) {
1456 } elsif ($t == pi) {
1458 } elsif ($r == 0 || $t == 0) {
1459 $theta = defined $format ? sprintf($format, $t) : $t;
1462 return "[$r,$theta]" if defined $theta;
1465 # Try to identify pi/n and friends.
1468 $t -= int(CORE::abs($t) / pi2) * pi2;
1470 if ($format{polar_pretty_print} && $t) {
1474 if ($b =~ /^-?\d+$/) {
1475 $b = $b < 0 ? "-" : "" if CORE::abs($b) == 1;
1476 $theta = "${b}pi/$a";
1482 if (defined $format) {
1483 $r = sprintf($format, $r);
1484 $theta = sprintf($format, $theta) unless defined $theta;
1486 $theta = $t unless defined $theta;
1489 return "[$r,$theta]";
1499 Math::Complex - complex numbers and associated mathematical functions
1505 $z = Math::Complex->make(5, 6);
1507 $j = cplxe(1, 2*pi/3);
1511 This package lets you create and manipulate complex numbers. By default,
1512 I<Perl> limits itself to real numbers, but an extra C<use> statement brings
1513 full complex support, along with a full set of mathematical functions
1514 typically associated with and/or extended to complex numbers.
1516 If you wonder what complex numbers are, they were invented to be able to solve
1517 the following equation:
1521 and by definition, the solution is noted I<i> (engineers use I<j> instead since
1522 I<i> usually denotes an intensity, but the name does not matter). The number
1523 I<i> is a pure I<imaginary> number.
1525 The arithmetics with pure imaginary numbers works just like you would expect
1526 it with real numbers... you just have to remember that
1532 5i + 7i = i * (5 + 7) = 12i
1533 4i - 3i = i * (4 - 3) = i
1538 Complex numbers are numbers that have both a real part and an imaginary
1539 part, and are usually noted:
1543 where C<a> is the I<real> part and C<b> is the I<imaginary> part. The
1544 arithmetic with complex numbers is straightforward. You have to
1545 keep track of the real and the imaginary parts, but otherwise the
1546 rules used for real numbers just apply:
1548 (4 + 3i) + (5 - 2i) = (4 + 5) + i(3 - 2) = 9 + i
1549 (2 + i) * (4 - i) = 2*4 + 4i -2i -i*i = 8 + 2i + 1 = 9 + 2i
1551 A graphical representation of complex numbers is possible in a plane
1552 (also called the I<complex plane>, but it's really a 2D plane).
1557 is the point whose coordinates are (a, b). Actually, it would
1558 be the vector originating from (0, 0) to (a, b). It follows that the addition
1559 of two complex numbers is a vectorial addition.
1561 Since there is a bijection between a point in the 2D plane and a complex
1562 number (i.e. the mapping is unique and reciprocal), a complex number
1563 can also be uniquely identified with polar coordinates:
1567 where C<rho> is the distance to the origin, and C<theta> the angle between
1568 the vector and the I<x> axis. There is a notation for this using the
1569 exponential form, which is:
1571 rho * exp(i * theta)
1573 where I<i> is the famous imaginary number introduced above. Conversion
1574 between this form and the cartesian form C<a + bi> is immediate:
1576 a = rho * cos(theta)
1577 b = rho * sin(theta)
1579 which is also expressed by this formula:
1581 z = rho * exp(i * theta) = rho * (cos theta + i * sin theta)
1583 In other words, it's the projection of the vector onto the I<x> and I<y>
1584 axes. Mathematicians call I<rho> the I<norm> or I<modulus> and I<theta>
1585 the I<argument> of the complex number. The I<norm> of C<z> is
1586 marked here as C<abs(z)>.
1588 The polar notation (also known as the trigonometric representation) is
1589 much more handy for performing multiplications and divisions of
1590 complex numbers, whilst the cartesian notation is better suited for
1591 additions and subtractions. Real numbers are on the I<x> axis, and
1592 therefore I<y> or I<theta> is zero or I<pi>.
1594 All the common operations that can be performed on a real number have
1595 been defined to work on complex numbers as well, and are merely
1596 I<extensions> of the operations defined on real numbers. This means
1597 they keep their natural meaning when there is no imaginary part, provided
1598 the number is within their definition set.
1600 For instance, the C<sqrt> routine which computes the square root of
1601 its argument is only defined for non-negative real numbers and yields a
1602 non-negative real number (it is an application from B<R+> to B<R+>).
1603 If we allow it to return a complex number, then it can be extended to
1604 negative real numbers to become an application from B<R> to B<C> (the
1605 set of complex numbers):
1607 sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i
1609 It can also be extended to be an application from B<C> to B<C>,
1610 whilst its restriction to B<R> behaves as defined above by using
1611 the following definition:
1613 sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2)
1615 Indeed, a negative real number can be noted C<[x,pi]> (the modulus
1616 I<x> is always non-negative, so C<[x,pi]> is really C<-x>, a negative
1617 number) and the above definition states that
1619 sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i
1621 which is exactly what we had defined for negative real numbers above.
1622 The C<sqrt> returns only one of the solutions: if you want the both,
1623 use the C<root> function.
1625 All the common mathematical functions defined on real numbers that
1626 are extended to complex numbers share that same property of working
1627 I<as usual> when the imaginary part is zero (otherwise, it would not
1628 be called an extension, would it?).
1630 A I<new> operation possible on a complex number that is
1631 the identity for real numbers is called the I<conjugate>, and is noted
1632 with a horizontal bar above the number, or C<~z> here.
1639 z * ~z = (a + bi) * (a - bi) = a*a + b*b
1641 We saw that the norm of C<z> was noted C<abs(z)> and was defined as the
1642 distance to the origin, also known as:
1644 rho = abs(z) = sqrt(a*a + b*b)
1648 z * ~z = abs(z) ** 2
1650 If z is a pure real number (i.e. C<b == 0>), then the above yields:
1654 which is true (C<abs> has the regular meaning for real number, i.e. stands
1655 for the absolute value). This example explains why the norm of C<z> is
1656 noted C<abs(z)>: it extends the C<abs> function to complex numbers, yet
1657 is the regular C<abs> we know when the complex number actually has no
1658 imaginary part... This justifies I<a posteriori> our use of the C<abs>
1659 notation for the norm.
1663 Given the following notations:
1665 z1 = a + bi = r1 * exp(i * t1)
1666 z2 = c + di = r2 * exp(i * t2)
1667 z = <any complex or real number>
1669 the following (overloaded) operations are supported on complex numbers:
1671 z1 + z2 = (a + c) + i(b + d)
1672 z1 - z2 = (a - c) + i(b - d)
1673 z1 * z2 = (r1 * r2) * exp(i * (t1 + t2))
1674 z1 / z2 = (r1 / r2) * exp(i * (t1 - t2))
1675 z1 ** z2 = exp(z2 * log z1)
1677 abs(z) = r1 = sqrt(a*a + b*b)
1678 sqrt(z) = sqrt(r1) * exp(i * t/2)
1679 exp(z) = exp(a) * exp(i * b)
1680 log(z) = log(r1) + i*t
1681 sin(z) = 1/2i (exp(i * z1) - exp(-i * z))
1682 cos(z) = 1/2 (exp(i * z1) + exp(-i * z))
1683 atan2(y, x) = atan(y / x) # Minding the right quadrant, note the order.
1685 The definition used for complex arguments of atan2() is
1687 -i log((x + iy)/sqrt(x*x+y*y))
1689 Note that atan2(0, 0) is not well-defined.
1691 The following extra operations are supported on both real and complex
1699 cbrt(z) = z ** (1/3)
1700 log10(z) = log(z) / log(10)
1701 logn(z, n) = log(z) / log(n)
1703 tan(z) = sin(z) / cos(z)
1709 asin(z) = -i * log(i*z + sqrt(1-z*z))
1710 acos(z) = -i * log(z + i*sqrt(1-z*z))
1711 atan(z) = i/2 * log((i+z) / (i-z))
1713 acsc(z) = asin(1 / z)
1714 asec(z) = acos(1 / z)
1715 acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i))
1717 sinh(z) = 1/2 (exp(z) - exp(-z))
1718 cosh(z) = 1/2 (exp(z) + exp(-z))
1719 tanh(z) = sinh(z) / cosh(z) = (exp(z) - exp(-z)) / (exp(z) + exp(-z))
1721 csch(z) = 1 / sinh(z)
1722 sech(z) = 1 / cosh(z)
1723 coth(z) = 1 / tanh(z)
1725 asinh(z) = log(z + sqrt(z*z+1))
1726 acosh(z) = log(z + sqrt(z*z-1))
1727 atanh(z) = 1/2 * log((1+z) / (1-z))
1729 acsch(z) = asinh(1 / z)
1730 asech(z) = acosh(1 / z)
1731 acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1))
1733 I<arg>, I<abs>, I<log>, I<csc>, I<cot>, I<acsc>, I<acot>, I<csch>,
1734 I<coth>, I<acosech>, I<acotanh>, have aliases I<rho>, I<theta>, I<ln>,
1735 I<cosec>, I<cotan>, I<acosec>, I<acotan>, I<cosech>, I<cotanh>,
1736 I<acosech>, I<acotanh>, respectively. C<Re>, C<Im>, C<arg>, C<abs>,
1737 C<rho>, and C<theta> can be used also as mutators. The C<cbrt>
1738 returns only one of the solutions: if you want all three, use the
1741 The I<root> function is available to compute all the I<n>
1742 roots of some complex, where I<n> is a strictly positive integer.
1743 There are exactly I<n> such roots, returned as a list. Getting the
1744 number mathematicians call C<j> such that:
1748 is a simple matter of writing:
1750 $j = ((root(1, 3))[1];
1752 The I<k>th root for C<z = [r,t]> is given by:
1754 (root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n)
1756 You can return the I<k>th root directly by C<root(z, n, k)>,
1757 indexing starting from I<zero> and ending at I<n - 1>.
1759 The I<spaceship> comparison operator, E<lt>=E<gt>, is also defined. In
1760 order to ensure its restriction to real numbers is conform to what you
1761 would expect, the comparison is run on the real part of the complex
1762 number first, and imaginary parts are compared only when the real
1767 To create a complex number, use either:
1769 $z = Math::Complex->make(3, 4);
1772 if you know the cartesian form of the number, or
1776 if you like. To create a number using the polar form, use either:
1778 $z = Math::Complex->emake(5, pi/3);
1779 $x = cplxe(5, pi/3);
1781 instead. The first argument is the modulus, the second is the angle
1782 (in radians, the full circle is 2*pi). (Mnemonic: C<e> is used as a
1783 notation for complex numbers in the polar form).
1785 It is possible to write:
1787 $x = cplxe(-3, pi/4);
1789 but that will be silently converted into C<[3,-3pi/4]>, since the
1790 modulus must be non-negative (it represents the distance to the origin
1791 in the complex plane).
1793 It is also possible to have a complex number as either argument of the
1794 C<make>, C<emake>, C<cplx>, and C<cplxe>: the appropriate component of
1795 the argument will be used.
1800 The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
1801 understand a single (string) argument of the forms
1809 in which case the appropriate cartesian and exponential components
1810 will be parsed from the string and used to create new complex numbers.
1811 The imaginary component and the theta, respectively, will default to zero.
1813 The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
1814 understand the case of no arguments: this means plain zero or (0, 0).
1818 When printed, a complex number is usually shown under its cartesian
1819 style I<a+bi>, but there are legitimate cases where the polar style
1820 I<[r,t]> is more appropriate. The process of converting the complex
1821 number into a string that can be displayed is known as I<stringification>.
1823 By calling the class method C<Math::Complex::display_format> and
1824 supplying either C<"polar"> or C<"cartesian"> as an argument, you
1825 override the default display style, which is C<"cartesian">. Not
1826 supplying any argument returns the current settings.
1828 This default can be overridden on a per-number basis by calling the
1829 C<display_format> method instead. As before, not supplying any argument
1830 returns the current display style for this number. Otherwise whatever you
1831 specify will be the new display style for I<this> particular number.
1837 Math::Complex::display_format('polar');
1838 $j = (root(1, 3))[1];
1839 print "j = $j\n"; # Prints "j = [1,2pi/3]"
1840 $j->display_format('cartesian');
1841 print "j = $j\n"; # Prints "j = -0.5+0.866025403784439i"
1843 The polar style attempts to emphasize arguments like I<k*pi/n>
1844 (where I<n> is a positive integer and I<k> an integer within [-9, +9]),
1845 this is called I<polar pretty-printing>.
1847 For the reverse of stringifying, see the C<make> and C<emake>.
1849 =head2 CHANGED IN PERL 5.6
1851 The C<display_format> class method and the corresponding
1852 C<display_format> object method can now be called using
1853 a parameter hash instead of just a one parameter.
1855 The old display format style, which can have values C<"cartesian"> or
1856 C<"polar">, can be changed using the C<"style"> parameter.
1858 $j->display_format(style => "polar");
1860 The one parameter calling convention also still works.
1862 $j->display_format("polar");
1864 There are two new display parameters.
1866 The first one is C<"format">, which is a sprintf()-style format string
1867 to be used for both numeric parts of the complex number(s). The is
1868 somewhat system-dependent but most often it corresponds to C<"%.15g">.
1869 You can revert to the default by setting the C<format> to C<undef>.
1871 # the $j from the above example
1873 $j->display_format('format' => '%.5f');
1874 print "j = $j\n"; # Prints "j = -0.50000+0.86603i"
1875 $j->display_format('format' => undef);
1876 print "j = $j\n"; # Prints "j = -0.5+0.86603i"
1878 Notice that this affects also the return values of the
1879 C<display_format> methods: in list context the whole parameter hash
1880 will be returned, as opposed to only the style parameter value.
1881 This is a potential incompatibility with earlier versions if you
1882 have been calling the C<display_format> method in list context.
1884 The second new display parameter is C<"polar_pretty_print">, which can
1885 be set to true or false, the default being true. See the previous
1886 section for what this means.
1890 Thanks to overloading, the handling of arithmetics with complex numbers
1891 is simple and almost transparent.
1893 Here are some examples:
1897 $j = cplxe(1, 2*pi/3); # $j ** 3 == 1
1898 print "j = $j, j**3 = ", $j ** 3, "\n";
1899 print "1 + j + j**2 = ", 1 + $j + $j**2, "\n";
1901 $z = -16 + 0*i; # Force it to be a complex
1902 print "sqrt($z) = ", sqrt($z), "\n";
1904 $k = exp(i * 2*pi/3);
1905 print "$j - $k = ", $j - $k, "\n";
1907 $z->Re(3); # Re, Im, arg, abs,
1908 $j->arg(2); # (the last two aka rho, theta)
1909 # can be used also as mutators.
1913 The constant C<pi> and some handy multiples of it (pi2, pi4,
1914 and pip2 (pi/2) and pip4 (pi/4)) are also available if separately
1917 use Math::Complex ':pi';
1918 $third_of_circle = pi2 / 3;
1920 =head1 ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
1922 The division (/) and the following functions
1928 atanh asech acsch acoth
1930 cannot be computed for all arguments because that would mean dividing
1931 by zero or taking logarithm of zero. These situations cause fatal
1932 runtime errors looking like this
1934 cot(0): Division by zero.
1935 (Because in the definition of cot(0), the divisor sin(0) is 0)
1940 atanh(-1): Logarithm of zero.
1943 For the C<csc>, C<cot>, C<asec>, C<acsc>, C<acot>, C<csch>, C<coth>,
1944 C<asech>, C<acsch>, the argument cannot be C<0> (zero). For the
1945 logarithmic functions and the C<atanh>, C<acoth>, the argument cannot
1946 be C<1> (one). For the C<atanh>, C<acoth>, the argument cannot be
1947 C<-1> (minus one). For the C<atan>, C<acot>, the argument cannot be
1948 C<i> (the imaginary unit). For the C<atan>, C<acoth>, the argument
1949 cannot be C<-i> (the negative imaginary unit). For the C<tan>,
1950 C<sec>, C<tanh>, the argument cannot be I<pi/2 + k * pi>, where I<k>
1951 is any integer. atan2(0, 0) is undefined, and if the complex arguments
1952 are used for atan2(), a division by zero will happen if z1**2+z2**2 == 0.
1954 Note that because we are operating on approximations of real numbers,
1955 these errors can happen when merely `too close' to the singularities
1958 =head1 ERRORS DUE TO INDIGESTIBLE ARGUMENTS
1960 The C<make> and C<emake> accept both real and complex arguments.
1961 When they cannot recognize the arguments they will die with error
1962 messages like the following
1964 Math::Complex::make: Cannot take real part of ...
1965 Math::Complex::make: Cannot take real part of ...
1966 Math::Complex::emake: Cannot take rho of ...
1967 Math::Complex::emake: Cannot take theta of ...
1971 Saying C<use Math::Complex;> exports many mathematical routines in the
1972 caller environment and even overrides some (C<sqrt>, C<log>, C<atan2>).
1973 This is construed as a feature by the Authors, actually... ;-)
1975 All routines expect to be given real or complex numbers. Don't attempt to
1976 use BigFloat, since Perl has currently no rule to disambiguate a '+'
1977 operation (for instance) between two overloaded entities.
1979 In Cray UNICOS there is some strange numerical instability that results
1980 in root(), cos(), sin(), cosh(), sinh(), losing accuracy fast. Beware.
1981 The bug may be in UNICOS math libs, in UNICOS C compiler, in Math::Complex.
1982 Whatever it is, it does not manifest itself anywhere else where Perl runs.
1986 Daniel S. Lewart <F<lewart!at!uiuc.edu>>
1987 Jarkko Hietaniemi <F<jhi!at!iki.fi>>
1988 Raphael Manfredi <F<Raphael_Manfredi!at!pobox.com>>