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
12 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $Inf $ExpInf);
21 4 => '1.70141183460469229e+38',
22 8 => '1.7976931348623157e+308',
23 # AFAICT the 10, 12, and 16-byte long doubles
24 # all have the same maximum.
25 10 => '1.1897314953572317650857593266280070162E+4932',
26 12 => '1.1897314953572317650857593266280070162E+4932',
27 16 => '1.1897314953572317650857593266280070162E+4932',
29 my $nvsize = $Config{nvsize} ||
30 ($Config{uselongdouble} && $Config{longdblsize}) ||
32 die "Math::Complex: Could not figure out nvsize\n"
33 unless defined $nvsize;
34 die "Math::Complex: Cannot not figure out max nv (nvsize = $nvsize)\n"
35 unless defined $DBL_MAX{$nvsize};
36 my $DBL_MAX = eval $DBL_MAX{$nvsize};
37 die "Math::Complex: Could not figure out max nv (nvsize = $nvsize)\n"
38 unless defined $DBL_MAX;
39 my $BIGGER_THAN_THIS = 1e30; # Must find something bigger than this.
40 if ($^O eq 'unicosmk') {
43 local $SIG{FPE} = { };
45 # We do want an arithmetic overflow, Inf INF inf Infinity.
47 'exp(99999)', # Enough even with 128-bit long doubles.
57 my $i = eval "$t+1.0";
58 if (defined $i && $i > $BIGGER_THAN_THIS) {
63 $Inf = $DBL_MAX unless defined $Inf; # Oh well, close enough.
64 die "Math::Complex: Could not get Infinity"
65 unless $Inf > $BIGGER_THAN_THIS;
68 # print "# On this machine, Inf = '$Inf'\n";
71 use Scalar::Util qw(set_prototype);
74 no warnings 'syntax'; # To avoid the (_) warnings.
77 # For certain functions that we override, in 5.10 or better
78 # we can set a smarter prototype that will handle the lexical $_
79 # (also a 5.10+ feature).
81 set_prototype \&abs, '_';
82 set_prototype \&cos, '_';
83 set_prototype \&exp, '_';
84 set_prototype \&log, '_';
85 set_prototype \&sin, '_';
86 set_prototype \&sqrt, '_';
93 # Regular expression for floating point numbers.
94 # These days we could use Scalar::Util::lln(), I guess.
95 my $gre = qr'\s*([\+\-]?(?:(?:(?:\d+(?:_\d+)*(?:\.\d*(?:_\d+)*)?|\.\d+(?:_\d+)*)(?:[eE][\+\-]?\d+(?:_\d+)*)?))|inf)'i;
104 csc cosec sec cot cotan
106 acsc acosec asec acot acotan
108 csch cosech sech coth cotanh
110 acsch acosech asech acoth acotanh
114 i Re Im rho theta arg
122 my @pi = qw(pi pi2 pi4 pip2 pip4 Inf);
144 '<=>' => \&_spaceship,
155 '""' => \&_stringify;
161 my %DISPLAY_FORMAT = ('style' => 'cartesian',
162 'polar_pretty_print' => 1);
163 my $eps = 1e-14; # Epsilon
166 # Object attributes (internal):
167 # cartesian [real, imaginary] -- cartesian form
168 # polar [rho, theta] -- polar form
169 # c_dirty cartesian form not up-to-date
170 # p_dirty polar form not up-to-date
171 # display display format (package's global when not set)
174 # Die on bad *make() arguments.
177 die "@{[(caller(1))[3]]}: Cannot take $_[0] of '$_[1]'.\n";
184 if ($arg =~ /^$gre$/) {
186 } elsif ($arg =~ /^(?:$gre)?$gre\s*i\s*$/) {
187 ($p, $q) = ($1 || 0, $2);
188 } elsif ($arg =~ /^\s*\(\s*$gre\s*(?:,\s*$gre\s*)?\)\s*$/) {
189 ($p, $q) = ($1, $2 || 0);
194 $p =~ s/^(-?)inf$/"${1}9**9**9"/e;
196 $q =~ s/^(-?)inf$/"${1}9**9**9"/e;
206 if ($arg =~ /^\s*\[\s*$gre\s*(?:,\s*$gre\s*)?\]\s*$/) {
207 ($p, $q) = ($1, $2 || 0);
208 } elsif ($arg =~ m!^\s*\[\s*$gre\s*(?:,\s*([-+]?\d*\s*)?pi(?:/\s*(\d+))?\s*)?\]\s*$!) {
209 ($p, $q) = ($1, ($2 eq '-' ? -1 : ($2 || 1)) * pi() / ($3 || 1));
210 } elsif ($arg =~ /^\s*\[\s*$gre\s*\]\s*$/) {
212 } elsif ($arg =~ /^\s*$gre\s*$/) {
219 $p =~ s/^(-?)inf$/"${1}9**9**9"/e;
220 $q =~ s/^(-?)inf$/"${1}9**9**9"/e;
228 my $clone = {%$self};
229 if ($self->{'cartesian'}) {
230 $clone->{'cartesian'} = [@{$self->{'cartesian'}}];
232 if ($self->{'polar'}) {
233 $clone->{'polar'} = [@{$self->{'polar'}}];
235 bless $clone,__PACKAGE__;
242 # Create a new complex number (cartesian form)
245 my $self = bless {}, shift;
250 return (ref $self)->emake($_[0])
251 if ($_[0] =~ /^\s*\[/);
252 ($re, $im) = _make($_[0]);
257 _cannot_make("real part", $re) unless $re =~ /^$gre$/;
260 _cannot_make("imaginary part", $im) unless $im =~ /^$gre$/;
261 $self->_set_cartesian([$re, $im ]);
262 $self->display_format('cartesian');
270 # Create a new complex number (exponential form)
273 my $self = bless {}, shift;
276 ($rho, $theta) = (0, 0);
278 return (ref $self)->make($_[0])
279 if ($_[0] =~ /^\s*\(/ || $_[0] =~ /i\s*$/);
280 ($rho, $theta) = _emake($_[0]);
284 if (defined $rho && defined $theta) {
287 $theta = ($theta <= 0) ? $theta + pi() : $theta - pi();
291 _cannot_make("rho", $rho) unless $rho =~ /^$gre$/;
294 _cannot_make("theta", $theta) unless $theta =~ /^$gre$/;
295 $self->_set_polar([$rho, $theta]);
296 $self->display_format('polar');
301 sub new { &make } # For backward compatibility only.
306 # Creates a complex number from a (re, im) tuple.
307 # This avoids the burden of writing Math::Complex->make(re, im).
310 return __PACKAGE__->make(@_);
316 # Creates a complex number from a (rho, theta) tuple.
317 # This avoids the burden of writing Math::Complex->emake(rho, theta).
320 return __PACKAGE__->emake(@_);
326 # The number defined as pi = 180 degrees
328 sub pi () { 4 * CORE::atan2(1, 1) }
335 sub pi2 () { 2 * pi }
340 # The full circle twice.
342 sub pi4 () { 4 * pi }
349 sub pip2 () { pi / 2 }
356 sub pip4 () { pi / 4 }
363 sub _uplog10 () { 1 / CORE::log(10) }
368 # The number defined as i*i = -1;
373 $i->{'cartesian'} = [0, 1];
374 $i->{'polar'} = [1, pip2];
385 sub _ip2 () { i / 2 }
388 # Attribute access/set routines
391 sub _cartesian {$_[0]->{c_dirty} ?
392 $_[0]->_update_cartesian : $_[0]->{'cartesian'}}
393 sub _polar {$_[0]->{p_dirty} ?
394 $_[0]->_update_polar : $_[0]->{'polar'}}
396 sub _set_cartesian { $_[0]->{p_dirty}++; $_[0]->{c_dirty} = 0;
397 $_[0]->{'cartesian'} = $_[1] }
398 sub _set_polar { $_[0]->{c_dirty}++; $_[0]->{p_dirty} = 0;
399 $_[0]->{'polar'} = $_[1] }
402 # ->_update_cartesian
404 # Recompute and return the cartesian form, given accurate polar form.
406 sub _update_cartesian {
408 my ($r, $t) = @{$self->{'polar'}};
409 $self->{c_dirty} = 0;
410 return $self->{'cartesian'} = [$r * CORE::cos($t), $r * CORE::sin($t)];
417 # Recompute and return the polar form, given accurate cartesian form.
421 my ($x, $y) = @{$self->{'cartesian'}};
422 $self->{p_dirty} = 0;
423 return $self->{'polar'} = [0, 0] if $x == 0 && $y == 0;
424 return $self->{'polar'} = [CORE::sqrt($x*$x + $y*$y),
425 CORE::atan2($y, $x)];
434 my ($z1, $z2, $regular) = @_;
435 my ($re1, $im1) = @{$z1->_cartesian};
436 $z2 = cplx($z2) unless ref $z2;
437 my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
438 unless (defined $regular) {
439 $z1->_set_cartesian([$re1 + $re2, $im1 + $im2]);
442 return (ref $z1)->make($re1 + $re2, $im1 + $im2);
451 my ($z1, $z2, $inverted) = @_;
452 my ($re1, $im1) = @{$z1->_cartesian};
453 $z2 = cplx($z2) unless ref $z2;
454 my ($re2, $im2) = @{$z2->_cartesian};
455 unless (defined $inverted) {
456 $z1->_set_cartesian([$re1 - $re2, $im1 - $im2]);
460 (ref $z1)->make($re2 - $re1, $im2 - $im1) :
461 (ref $z1)->make($re1 - $re2, $im1 - $im2);
471 my ($z1, $z2, $regular) = @_;
472 if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
473 # if both polar better use polar to avoid rounding errors
474 my ($r1, $t1) = @{$z1->_polar};
475 my ($r2, $t2) = @{$z2->_polar};
477 if ($t > pi()) { $t -= pi2 }
478 elsif ($t <= -pi()) { $t += pi2 }
479 unless (defined $regular) {
480 $z1->_set_polar([$r1 * $r2, $t]);
483 return (ref $z1)->emake($r1 * $r2, $t);
485 my ($x1, $y1) = @{$z1->_cartesian};
487 my ($x2, $y2) = @{$z2->_cartesian};
488 return (ref $z1)->make($x1*$x2-$y1*$y2, $x1*$y2+$y1*$x2);
490 return (ref $z1)->make($x1*$z2, $y1*$z2);
498 # Die on division by zero.
501 my $mess = "$_[0]: Division by zero.\n";
504 $mess .= "(Because in the definition of $_[0], the divisor ";
505 $mess .= "$_[1] " unless ("$_[1]" eq '0');
511 $mess .= "Died at $up[1] line $up[2].\n";
522 my ($z1, $z2, $inverted) = @_;
523 if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
524 # if both polar better use polar to avoid rounding errors
525 my ($r1, $t1) = @{$z1->_polar};
526 my ($r2, $t2) = @{$z2->_polar};
529 _divbyzero "$z2/0" if ($r1 == 0);
531 if ($t > pi()) { $t -= pi2 }
532 elsif ($t <= -pi()) { $t += pi2 }
533 return (ref $z1)->emake($r2 / $r1, $t);
535 _divbyzero "$z1/0" if ($r2 == 0);
537 if ($t > pi()) { $t -= pi2 }
538 elsif ($t <= -pi()) { $t += pi2 }
539 return (ref $z1)->emake($r1 / $r2, $t);
544 ($x2, $y2) = @{$z1->_cartesian};
545 $d = $x2*$x2 + $y2*$y2;
546 _divbyzero "$z2/0" if $d == 0;
547 return (ref $z1)->make(($x2*$z2)/$d, -($y2*$z2)/$d);
549 my ($x1, $y1) = @{$z1->_cartesian};
551 ($x2, $y2) = @{$z2->_cartesian};
552 $d = $x2*$x2 + $y2*$y2;
553 _divbyzero "$z1/0" if $d == 0;
554 my $u = ($x1*$x2 + $y1*$y2)/$d;
555 my $v = ($y1*$x2 - $x1*$y2)/$d;
556 return (ref $z1)->make($u, $v);
558 _divbyzero "$z1/0" if $z2 == 0;
559 return (ref $z1)->make($x1/$z2, $y1/$z2);
568 # Computes z1**z2 = exp(z2 * log z1)).
571 my ($z1, $z2, $inverted) = @_;
573 return 1 if $z1 == 0 || $z2 == 1;
574 return 0 if $z2 == 0 && Re($z1) > 0;
576 return 1 if $z2 == 0 || $z1 == 1;
577 return 0 if $z1 == 0 && Re($z2) > 0;
579 my $w = $inverted ? &exp($z1 * &log($z2))
580 : &exp($z2 * &log($z1));
581 # If both arguments cartesian, return cartesian, else polar.
582 return $z1->{c_dirty} == 0 &&
583 (not ref $z2 or $z2->{c_dirty} == 0) ?
584 cplx(@{$w->_cartesian}) : $w;
590 # Computes z1 <=> z2.
591 # Sorts on the real part first, then on the imaginary part. Thus 2-4i < 3+8i.
594 my ($z1, $z2, $inverted) = @_;
595 my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
596 my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
597 my $sgn = $inverted ? -1 : 1;
598 return $sgn * ($re1 <=> $re2) if $re1 != $re2;
599 return $sgn * ($im1 <=> $im2);
607 # (Required in addition to _spaceship() because of NaNs.)
609 my ($z1, $z2, $inverted) = @_;
610 my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
611 my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
612 return $re1 == $re2 && $im1 == $im2 ? 1 : 0;
623 my ($r, $t) = @{$z->_polar};
624 $t = ($t <= 0) ? $t + pi : $t - pi;
625 return (ref $z)->emake($r, $t);
627 my ($re, $im) = @{$z->_cartesian};
628 return (ref $z)->make(-$re, -$im);
634 # Compute complex's _conjugate.
639 my ($r, $t) = @{$z->_polar};
640 return (ref $z)->emake($r, -$t);
642 my ($re, $im) = @{$z->_cartesian};
643 return (ref $z)->make($re, -$im);
649 # Compute or set complex's norm (rho).
652 my ($z, $rho) = @_ ? @_ : $_;
657 return CORE::abs($z);
661 $z->{'polar'} = [ $rho, ${$z->_polar}[1] ];
666 return ${$z->_polar}[0];
673 if ($$theta > pi()) { $$theta -= pi2 }
674 elsif ($$theta <= -pi()) { $$theta += pi2 }
680 # Compute or set complex's argument (theta).
683 my ($z, $theta) = @_;
684 return $z unless ref $z;
685 if (defined $theta) {
687 $z->{'polar'} = [ ${$z->_polar}[0], $theta ];
691 $theta = ${$z->_polar}[1];
702 # It is quite tempting to use wantarray here so that in list context
703 # sqrt() would return the two solutions. This, however, would
706 # print "sqrt(z) = ", sqrt($z), "\n";
708 # The two values would be printed side by side without no intervening
709 # whitespace, quite confusing.
710 # Therefore if you want the two solutions use the root().
713 my ($z) = @_ ? $_[0] : $_;
714 my ($re, $im) = ref $z ? @{$z->_cartesian} : ($z, 0);
715 return $re < 0 ? cplx(0, CORE::sqrt(-$re)) : CORE::sqrt($re)
717 my ($r, $t) = @{$z->_polar};
718 return (ref $z)->emake(CORE::sqrt($r), $t/2);
724 # Compute cbrt(z) (cubic root).
726 # Why are we not returning three values? The same answer as for sqrt().
731 -CORE::exp(CORE::log(-$z)/3) :
732 ($z > 0 ? CORE::exp(CORE::log($z)/3): 0)
734 my ($r, $t) = @{$z->_polar};
736 return (ref $z)->emake(CORE::exp(CORE::log($r)/3), $t/3);
745 my $mess = "Root '$_[0]' illegal, root rank must be positive integer.\n";
749 $mess .= "Died at $up[1] line $up[2].\n";
757 # Computes all nth root for z, returning an array whose size is n.
758 # `n' must be a positive integer.
760 # The roots are given by (for k = 0..n-1):
762 # z^(1/n) = r^(1/n) (cos ((t+2 k pi)/n) + i sin ((t+2 k pi)/n))
765 my ($z, $n, $k) = @_;
766 _rootbad($n) if ($n < 1 or int($n) != $n);
767 my ($r, $t) = ref $z ?
768 @{$z->_polar} : (CORE::abs($z), $z >= 0 ? 0 : pi);
769 my $theta_inc = pi2 / $n;
770 my $rho = $r ** (1/$n);
771 my $cartesian = ref $z && $z->{c_dirty} == 0;
774 for (my $i = 0, my $theta = $t / $n;
776 $i++, $theta += $theta_inc) {
777 my $w = cplxe($rho, $theta);
778 # Yes, $cartesian is loop invariant.
779 push @root, $cartesian ? cplx(@{$w->_cartesian}) : $w;
783 my $w = cplxe($rho, $t / $n + $k * $theta_inc);
784 return $cartesian ? cplx(@{$w->_cartesian}) : $w;
791 # Return or set Re(z).
795 return $z unless ref $z;
797 $z->{'cartesian'} = [ $Re, ${$z->_cartesian}[1] ];
801 return ${$z->_cartesian}[0];
808 # Return or set Im(z).
812 return 0 unless ref $z;
814 $z->{'cartesian'} = [ ${$z->_cartesian}[0], $Im ];
818 return ${$z->_cartesian}[1];
825 # Return or set rho(w).
828 Math::Complex::abs(@_);
834 # Return or set theta(w).
837 Math::Complex::arg(@_);
846 my ($z) = @_ ? @_ : $_;
847 return CORE::exp($z) unless ref $z;
848 my ($x, $y) = @{$z->_cartesian};
849 return (ref $z)->emake(CORE::exp($x), $y);
855 # Die on logarithm of zero.
858 my $mess = "$_[0]: Logarithm of zero.\n";
861 $mess .= "(Because in the definition of $_[0], the argument ";
862 $mess .= "$_[1] " unless ($_[1] eq '0');
868 $mess .= "Died at $up[1] line $up[2].\n";
879 my ($z) = @_ ? @_ : $_;
881 _logofzero("log") if $z == 0;
882 return $z > 0 ? CORE::log($z) : cplx(CORE::log(-$z), pi);
884 my ($r, $t) = @{$z->_polar};
885 _logofzero("log") if $r == 0;
886 if ($t > pi()) { $t -= pi2 }
887 elsif ($t <= -pi()) { $t += pi2 }
888 return (ref $z)->make(CORE::log($r), $t);
896 sub ln { Math::Complex::log(@_) }
905 return Math::Complex::log($_[0]) * _uplog10;
911 # Compute logn(z,n) = log(z) / log(n)
915 $z = cplx($z, 0) unless ref $z;
916 my $logn = $LOGN{$n};
917 $logn = $LOGN{$n} = CORE::log($n) unless defined $logn; # Cache log(n)
918 return &log($z) / $logn;
924 # Compute cos(z) = (exp(iz) + exp(-iz))/2.
927 my ($z) = @_ ? @_ : $_;
928 return CORE::cos($z) unless ref $z;
929 my ($x, $y) = @{$z->_cartesian};
930 my $ey = CORE::exp($y);
931 my $sx = CORE::sin($x);
932 my $cx = CORE::cos($x);
933 my $ey_1 = $ey ? 1 / $ey : Inf();
934 return (ref $z)->make($cx * ($ey + $ey_1)/2,
935 $sx * ($ey_1 - $ey)/2);
941 # Compute sin(z) = (exp(iz) - exp(-iz))/2.
944 my ($z) = @_ ? @_ : $_;
945 return CORE::sin($z) unless ref $z;
946 my ($x, $y) = @{$z->_cartesian};
947 my $ey = CORE::exp($y);
948 my $sx = CORE::sin($x);
949 my $cx = CORE::cos($x);
950 my $ey_1 = $ey ? 1 / $ey : Inf();
951 return (ref $z)->make($sx * ($ey + $ey_1)/2,
952 $cx * ($ey - $ey_1)/2);
958 # Compute tan(z) = sin(z) / cos(z).
963 _divbyzero "tan($z)", "cos($z)" if $cz == 0;
964 return &sin($z) / $cz;
970 # Computes the secant sec(z) = 1 / cos(z).
975 _divbyzero "sec($z)", "cos($z)" if ($cz == 0);
982 # Computes the cosecant csc(z) = 1 / sin(z).
987 _divbyzero "csc($z)", "sin($z)" if ($sz == 0);
996 sub cosec { Math::Complex::csc(@_) }
1001 # Computes cot(z) = cos(z) / sin(z).
1006 _divbyzero "cot($z)", "sin($z)" if ($sz == 0);
1007 return &cos($z) / $sz;
1015 sub cotan { Math::Complex::cot(@_) }
1020 # Computes the arc cosine acos(z) = -i log(z + sqrt(z*z-1)).
1024 return CORE::atan2(CORE::sqrt(1-$z*$z), $z)
1025 if (! ref $z) && CORE::abs($z) <= 1;
1026 $z = cplx($z, 0) unless ref $z;
1027 my ($x, $y) = @{$z->_cartesian};
1028 return 0 if $x == 1 && $y == 0;
1029 my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
1030 my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
1031 my $alpha = ($t1 + $t2)/2;
1032 my $beta = ($t1 - $t2)/2;
1033 $alpha = 1 if $alpha < 1;
1034 if ($beta > 1) { $beta = 1 }
1035 elsif ($beta < -1) { $beta = -1 }
1036 my $u = CORE::atan2(CORE::sqrt(1-$beta*$beta), $beta);
1037 my $v = CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
1038 $v = -$v if $y > 0 || ($y == 0 && $x < -1);
1039 return (ref $z)->make($u, $v);
1045 # Computes the arc sine asin(z) = -i log(iz + sqrt(1-z*z)).
1049 return CORE::atan2($z, CORE::sqrt(1-$z*$z))
1050 if (! ref $z) && CORE::abs($z) <= 1;
1051 $z = cplx($z, 0) unless ref $z;
1052 my ($x, $y) = @{$z->_cartesian};
1053 return 0 if $x == 0 && $y == 0;
1054 my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
1055 my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
1056 my $alpha = ($t1 + $t2)/2;
1057 my $beta = ($t1 - $t2)/2;
1058 $alpha = 1 if $alpha < 1;
1059 if ($beta > 1) { $beta = 1 }
1060 elsif ($beta < -1) { $beta = -1 }
1061 my $u = CORE::atan2($beta, CORE::sqrt(1-$beta*$beta));
1062 my $v = -CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
1063 $v = -$v if $y > 0 || ($y == 0 && $x < -1);
1064 return (ref $z)->make($u, $v);
1070 # Computes the arc tangent atan(z) = i/2 log((i+z) / (i-z)).
1074 return CORE::atan2($z, 1) unless ref $z;
1075 my ($x, $y) = ref $z ? @{$z->_cartesian} : ($z, 0);
1076 return 0 if $x == 0 && $y == 0;
1077 _divbyzero "atan(i)" if ( $z == i);
1078 _logofzero "atan(-i)" if (-$z == i); # -i is a bad file test...
1079 my $log = &log((i + $z) / (i - $z));
1086 # Computes the arc secant asec(z) = acos(1 / z).
1090 _divbyzero "asec($z)", $z if ($z == 0);
1091 return acos(1 / $z);
1097 # Computes the arc cosecant acsc(z) = asin(1 / z).
1101 _divbyzero "acsc($z)", $z if ($z == 0);
1102 return asin(1 / $z);
1110 sub acosec { Math::Complex::acsc(@_) }
1115 # Computes the arc cotangent acot(z) = atan(1 / z)
1119 _divbyzero "acot(0)" if $z == 0;
1120 return ($z >= 0) ? CORE::atan2(1, $z) : CORE::atan2(-1, -$z)
1122 _divbyzero "acot(i)" if ($z - i == 0);
1123 _logofzero "acot(-i)" if ($z + i == 0);
1124 return atan(1 / $z);
1132 sub acotan { Math::Complex::acot(@_) }
1137 # Computes the hyperbolic cosine cosh(z) = (exp(z) + exp(-z))/2.
1143 $ex = CORE::exp($z);
1144 return $ex ? ($ex == $ExpInf ? Inf() : ($ex + 1/$ex)/2) : Inf();
1146 my ($x, $y) = @{$z->_cartesian};
1147 $ex = CORE::exp($x);
1148 my $ex_1 = $ex ? 1 / $ex : Inf();
1149 return (ref $z)->make(CORE::cos($y) * ($ex + $ex_1)/2,
1150 CORE::sin($y) * ($ex - $ex_1)/2);
1156 # Computes the hyperbolic sine sinh(z) = (exp(z) - exp(-z))/2.
1162 return 0 if $z == 0;
1163 $ex = CORE::exp($z);
1164 return $ex ? ($ex == $ExpInf ? Inf() : ($ex - 1/$ex)/2) : -Inf();
1166 my ($x, $y) = @{$z->_cartesian};
1167 my $cy = CORE::cos($y);
1168 my $sy = CORE::sin($y);
1169 $ex = CORE::exp($x);
1170 my $ex_1 = $ex ? 1 / $ex : Inf();
1171 return (ref $z)->make(CORE::cos($y) * ($ex - $ex_1)/2,
1172 CORE::sin($y) * ($ex + $ex_1)/2);
1178 # Computes the hyperbolic tangent tanh(z) = sinh(z) / cosh(z).
1183 _divbyzero "tanh($z)", "cosh($z)" if ($cz == 0);
1185 return 1 if $cz == $sz;
1186 return -1 if $cz == -$sz;
1193 # Computes the hyperbolic secant sech(z) = 1 / cosh(z).
1198 _divbyzero "sech($z)", "cosh($z)" if ($cz == 0);
1205 # Computes the hyperbolic cosecant csch(z) = 1 / sinh(z).
1210 _divbyzero "csch($z)", "sinh($z)" if ($sz == 0);
1219 sub cosech { Math::Complex::csch(@_) }
1224 # Computes the hyperbolic cotangent coth(z) = cosh(z) / sinh(z).
1229 _divbyzero "coth($z)", "sinh($z)" if $sz == 0;
1231 return 1 if $cz == $sz;
1232 return -1 if $cz == -$sz;
1241 sub cotanh { Math::Complex::coth(@_) }
1246 # Computes the area/inverse hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)).
1253 my ($re, $im) = @{$z->_cartesian};
1255 return CORE::log($re + CORE::sqrt($re*$re - 1))
1257 return cplx(0, CORE::atan2(CORE::sqrt(1 - $re*$re), $re))
1258 if CORE::abs($re) < 1;
1260 my $t = &sqrt($z * $z - 1) + $z;
1261 # Try Taylor if looking bad (this usually means that
1262 # $z was large negative, therefore the sqrt is really
1263 # close to abs(z), summing that with z...)
1264 $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
1267 $u->Im(-$u->Im) if $re < 0 && $im == 0;
1268 return $re < 0 ? -$u : $u;
1274 # Computes the area/inverse hyperbolic sine asinh(z) = log(z + sqrt(z*z+1))
1279 my $t = $z + CORE::sqrt($z*$z + 1);
1280 return CORE::log($t) if $t;
1282 my $t = &sqrt($z * $z + 1) + $z;
1283 # Try Taylor if looking bad (this usually means that
1284 # $z was large negative, therefore the sqrt is really
1285 # close to abs(z), summing that with z...)
1286 $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
1294 # Computes the area/inverse hyperbolic tangent atanh(z) = 1/2 log((1+z) / (1-z)).
1299 return CORE::log((1 + $z)/(1 - $z))/2 if CORE::abs($z) < 1;
1302 _divbyzero 'atanh(1)', "1 - $z" if (1 - $z == 0);
1303 _logofzero 'atanh(-1)' if (1 + $z == 0);
1304 return 0.5 * &log((1 + $z) / (1 - $z));
1310 # Computes the area/inverse hyperbolic secant asech(z) = acosh(1 / z).
1314 _divbyzero 'asech(0)', "$z" if ($z == 0);
1315 return acosh(1 / $z);
1321 # Computes the area/inverse hyperbolic cosecant acsch(z) = asinh(1 / z).
1325 _divbyzero 'acsch(0)', $z if ($z == 0);
1326 return asinh(1 / $z);
1332 # Alias for acosh().
1334 sub acosech { Math::Complex::acsch(@_) }
1339 # Computes the area/inverse hyperbolic cotangent acoth(z) = 1/2 log((1+z) / (z-1)).
1343 _divbyzero 'acoth(0)' if ($z == 0);
1345 return CORE::log(($z + 1)/($z - 1))/2 if CORE::abs($z) > 1;
1348 _divbyzero 'acoth(1)', "$z - 1" if ($z - 1 == 0);
1349 _logofzero 'acoth(-1)', "1 + $z" if (1 + $z == 0);
1350 return &log((1 + $z) / ($z - 1)) / 2;
1358 sub acotanh { Math::Complex::acoth(@_) }
1363 # Compute atan(z1/z2), minding the right quadrant.
1366 my ($z1, $z2, $inverted) = @_;
1367 my ($re1, $im1, $re2, $im2);
1369 ($re1, $im1) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
1370 ($re2, $im2) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
1372 ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0);
1373 ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0);
1376 # In MATLAB the imaginary parts are ignored.
1377 # warn "atan2: Imaginary parts ignored";
1378 # http://documents.wolfram.com/mathematica/functions/ArcTan
1379 # NOTE: Mathematica ArcTan[x,y] while atan2(y,x)
1380 my $s = $z1 * $z1 + $z2 * $z2;
1381 _divbyzero("atan2") if $s == 0;
1383 my $r = $z2 + $z1 * $i;
1384 return -$i * &log($r / &sqrt( $s ));
1386 return CORE::atan2($re1, $re2);
1393 # Set (get if no argument) the display format for all complex numbers that
1394 # don't happen to have overridden it via ->display_format
1396 # When called as an object method, this actually sets the display format for
1397 # the current object.
1399 # Valid object formats are 'c' and 'p' for cartesian and polar. The first
1400 # letter is used actually, so the type can be fully spelled out for clarity.
1402 sub display_format {
1404 my %display_format = %DISPLAY_FORMAT;
1406 if (ref $self) { # Called as an object method
1407 if (exists $self->{display_format}) {
1408 my %obj = %{$self->{display_format}};
1409 @display_format{keys %obj} = values %obj;
1413 $display_format{style} = shift;
1416 @display_format{keys %new} = values %new;
1419 if (ref $self) { # Called as an object method
1420 $self->{display_format} = { %display_format };
1423 %{$self->{display_format}} :
1424 $self->{display_format}->{style};
1427 # Called as a class method
1428 %DISPLAY_FORMAT = %display_format;
1432 $DISPLAY_FORMAT{style};
1438 # Show nicely formatted complex number under its cartesian or polar form,
1439 # depending on the current display format:
1441 # . If a specific display format has been recorded for this object, use it.
1442 # . Otherwise, use the generic current default for all complex numbers,
1443 # which is a package global variable.
1448 my $style = $z->display_format;
1450 $style = $DISPLAY_FORMAT{style} unless defined $style;
1452 return $z->_stringify_polar if $style =~ /^p/i;
1453 return $z->_stringify_cartesian;
1457 # ->_stringify_cartesian
1459 # Stringify as a cartesian representation 'a+bi'.
1461 sub _stringify_cartesian {
1463 my ($x, $y) = @{$z->_cartesian};
1466 my %format = $z->display_format;
1467 my $format = $format{format};
1470 if ($x =~ /^NaN[QS]?$/i) {
1473 if ($x =~ /^-?\Q$Inf\E$/oi) {
1476 $re = defined $format ? sprintf($format, $x) : $x;
1484 if ($y =~ /^(NaN[QS]?)$/i) {
1487 if ($y =~ /^-?\Q$Inf\E$/oi) {
1492 sprintf($format, $y) :
1493 ($y == 1 ? "" : ($y == -1 ? "-" : $y));
1506 } elsif ($y > 0 || $im =~ /^NaN[QS]?i$/i) {
1507 $str .= "+" if defined $re;
1510 } elsif (!defined $re) {
1519 # ->_stringify_polar
1521 # Stringify as a polar representation '[r,t]'.
1523 sub _stringify_polar {
1525 my ($r, $t) = @{$z->_polar};
1528 my %format = $z->display_format;
1529 my $format = $format{format};
1531 if ($t =~ /^NaN[QS]?$/i || $t =~ /^-?\Q$Inf\E$/oi) {
1533 } elsif ($t == pi) {
1535 } elsif ($r == 0 || $t == 0) {
1536 $theta = defined $format ? sprintf($format, $t) : $t;
1539 return "[$r,$theta]" if defined $theta;
1542 # Try to identify pi/n and friends.
1545 $t -= int(CORE::abs($t) / pi2) * pi2;
1547 if ($format{polar_pretty_print} && $t) {
1551 if ($b =~ /^-?\d+$/) {
1552 $b = $b < 0 ? "-" : "" if CORE::abs($b) == 1;
1553 $theta = "${b}pi/$a";
1559 if (defined $format) {
1560 $r = sprintf($format, $r);
1561 $theta = sprintf($format, $t) unless defined $theta;
1563 $theta = $t unless defined $theta;
1566 return "[$r,$theta]";
1580 Math::Complex - complex numbers and associated mathematical functions
1586 $z = Math::Complex->make(5, 6);
1588 $j = cplxe(1, 2*pi/3);
1592 This package lets you create and manipulate complex numbers. By default,
1593 I<Perl> limits itself to real numbers, but an extra C<use> statement brings
1594 full complex support, along with a full set of mathematical functions
1595 typically associated with and/or extended to complex numbers.
1597 If you wonder what complex numbers are, they were invented to be able to solve
1598 the following equation:
1602 and by definition, the solution is noted I<i> (engineers use I<j> instead since
1603 I<i> usually denotes an intensity, but the name does not matter). The number
1604 I<i> is a pure I<imaginary> number.
1606 The arithmetics with pure imaginary numbers works just like you would expect
1607 it with real numbers... you just have to remember that
1613 5i + 7i = i * (5 + 7) = 12i
1614 4i - 3i = i * (4 - 3) = i
1619 Complex numbers are numbers that have both a real part and an imaginary
1620 part, and are usually noted:
1624 where C<a> is the I<real> part and C<b> is the I<imaginary> part. The
1625 arithmetic with complex numbers is straightforward. You have to
1626 keep track of the real and the imaginary parts, but otherwise the
1627 rules used for real numbers just apply:
1629 (4 + 3i) + (5 - 2i) = (4 + 5) + i(3 - 2) = 9 + i
1630 (2 + i) * (4 - i) = 2*4 + 4i -2i -i*i = 8 + 2i + 1 = 9 + 2i
1632 A graphical representation of complex numbers is possible in a plane
1633 (also called the I<complex plane>, but it's really a 2D plane).
1638 is the point whose coordinates are (a, b). Actually, it would
1639 be the vector originating from (0, 0) to (a, b). It follows that the addition
1640 of two complex numbers is a vectorial addition.
1642 Since there is a bijection between a point in the 2D plane and a complex
1643 number (i.e. the mapping is unique and reciprocal), a complex number
1644 can also be uniquely identified with polar coordinates:
1648 where C<rho> is the distance to the origin, and C<theta> the angle between
1649 the vector and the I<x> axis. There is a notation for this using the
1650 exponential form, which is:
1652 rho * exp(i * theta)
1654 where I<i> is the famous imaginary number introduced above. Conversion
1655 between this form and the cartesian form C<a + bi> is immediate:
1657 a = rho * cos(theta)
1658 b = rho * sin(theta)
1660 which is also expressed by this formula:
1662 z = rho * exp(i * theta) = rho * (cos theta + i * sin theta)
1664 In other words, it's the projection of the vector onto the I<x> and I<y>
1665 axes. Mathematicians call I<rho> the I<norm> or I<modulus> and I<theta>
1666 the I<argument> of the complex number. The I<norm> of C<z> is
1667 marked here as C<abs(z)>.
1669 The polar notation (also known as the trigonometric representation) is
1670 much more handy for performing multiplications and divisions of
1671 complex numbers, whilst the cartesian notation is better suited for
1672 additions and subtractions. Real numbers are on the I<x> axis, and
1673 therefore I<y> or I<theta> is zero or I<pi>.
1675 All the common operations that can be performed on a real number have
1676 been defined to work on complex numbers as well, and are merely
1677 I<extensions> of the operations defined on real numbers. This means
1678 they keep their natural meaning when there is no imaginary part, provided
1679 the number is within their definition set.
1681 For instance, the C<sqrt> routine which computes the square root of
1682 its argument is only defined for non-negative real numbers and yields a
1683 non-negative real number (it is an application from B<R+> to B<R+>).
1684 If we allow it to return a complex number, then it can be extended to
1685 negative real numbers to become an application from B<R> to B<C> (the
1686 set of complex numbers):
1688 sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i
1690 It can also be extended to be an application from B<C> to B<C>,
1691 whilst its restriction to B<R> behaves as defined above by using
1692 the following definition:
1694 sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2)
1696 Indeed, a negative real number can be noted C<[x,pi]> (the modulus
1697 I<x> is always non-negative, so C<[x,pi]> is really C<-x>, a negative
1698 number) and the above definition states that
1700 sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i
1702 which is exactly what we had defined for negative real numbers above.
1703 The C<sqrt> returns only one of the solutions: if you want the both,
1704 use the C<root> function.
1706 All the common mathematical functions defined on real numbers that
1707 are extended to complex numbers share that same property of working
1708 I<as usual> when the imaginary part is zero (otherwise, it would not
1709 be called an extension, would it?).
1711 A I<new> operation possible on a complex number that is
1712 the identity for real numbers is called the I<conjugate>, and is noted
1713 with a horizontal bar above the number, or C<~z> here.
1720 z * ~z = (a + bi) * (a - bi) = a*a + b*b
1722 We saw that the norm of C<z> was noted C<abs(z)> and was defined as the
1723 distance to the origin, also known as:
1725 rho = abs(z) = sqrt(a*a + b*b)
1729 z * ~z = abs(z) ** 2
1731 If z is a pure real number (i.e. C<b == 0>), then the above yields:
1735 which is true (C<abs> has the regular meaning for real number, i.e. stands
1736 for the absolute value). This example explains why the norm of C<z> is
1737 noted C<abs(z)>: it extends the C<abs> function to complex numbers, yet
1738 is the regular C<abs> we know when the complex number actually has no
1739 imaginary part... This justifies I<a posteriori> our use of the C<abs>
1740 notation for the norm.
1744 Given the following notations:
1746 z1 = a + bi = r1 * exp(i * t1)
1747 z2 = c + di = r2 * exp(i * t2)
1748 z = <any complex or real number>
1750 the following (overloaded) operations are supported on complex numbers:
1752 z1 + z2 = (a + c) + i(b + d)
1753 z1 - z2 = (a - c) + i(b - d)
1754 z1 * z2 = (r1 * r2) * exp(i * (t1 + t2))
1755 z1 / z2 = (r1 / r2) * exp(i * (t1 - t2))
1756 z1 ** z2 = exp(z2 * log z1)
1758 abs(z) = r1 = sqrt(a*a + b*b)
1759 sqrt(z) = sqrt(r1) * exp(i * t/2)
1760 exp(z) = exp(a) * exp(i * b)
1761 log(z) = log(r1) + i*t
1762 sin(z) = 1/2i (exp(i * z1) - exp(-i * z))
1763 cos(z) = 1/2 (exp(i * z1) + exp(-i * z))
1764 atan2(y, x) = atan(y / x) # Minding the right quadrant, note the order.
1766 The definition used for complex arguments of atan2() is
1768 -i log((x + iy)/sqrt(x*x+y*y))
1770 Note that atan2(0, 0) is not well-defined.
1772 The following extra operations are supported on both real and complex
1780 cbrt(z) = z ** (1/3)
1781 log10(z) = log(z) / log(10)
1782 logn(z, n) = log(z) / log(n)
1784 tan(z) = sin(z) / cos(z)
1790 asin(z) = -i * log(i*z + sqrt(1-z*z))
1791 acos(z) = -i * log(z + i*sqrt(1-z*z))
1792 atan(z) = i/2 * log((i+z) / (i-z))
1794 acsc(z) = asin(1 / z)
1795 asec(z) = acos(1 / z)
1796 acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i))
1798 sinh(z) = 1/2 (exp(z) - exp(-z))
1799 cosh(z) = 1/2 (exp(z) + exp(-z))
1800 tanh(z) = sinh(z) / cosh(z) = (exp(z) - exp(-z)) / (exp(z) + exp(-z))
1802 csch(z) = 1 / sinh(z)
1803 sech(z) = 1 / cosh(z)
1804 coth(z) = 1 / tanh(z)
1806 asinh(z) = log(z + sqrt(z*z+1))
1807 acosh(z) = log(z + sqrt(z*z-1))
1808 atanh(z) = 1/2 * log((1+z) / (1-z))
1810 acsch(z) = asinh(1 / z)
1811 asech(z) = acosh(1 / z)
1812 acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1))
1814 I<arg>, I<abs>, I<log>, I<csc>, I<cot>, I<acsc>, I<acot>, I<csch>,
1815 I<coth>, I<acosech>, I<acotanh>, have aliases I<rho>, I<theta>, I<ln>,
1816 I<cosec>, I<cotan>, I<acosec>, I<acotan>, I<cosech>, I<cotanh>,
1817 I<acosech>, I<acotanh>, respectively. C<Re>, C<Im>, C<arg>, C<abs>,
1818 C<rho>, and C<theta> can be used also as mutators. The C<cbrt>
1819 returns only one of the solutions: if you want all three, use the
1822 The I<root> function is available to compute all the I<n>
1823 roots of some complex, where I<n> is a strictly positive integer.
1824 There are exactly I<n> such roots, returned as a list. Getting the
1825 number mathematicians call C<j> such that:
1829 is a simple matter of writing:
1831 $j = ((root(1, 3))[1];
1833 The I<k>th root for C<z = [r,t]> is given by:
1835 (root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n)
1837 You can return the I<k>th root directly by C<root(z, n, k)>,
1838 indexing starting from I<zero> and ending at I<n - 1>.
1840 The I<spaceship> numeric comparison operator, E<lt>=E<gt>, is also
1841 defined. In order to ensure its restriction to real numbers is conform
1842 to what you would expect, the comparison is run on the real part of
1843 the complex number first, and imaginary parts are compared only when
1844 the real parts match.
1848 To create a complex number, use either:
1850 $z = Math::Complex->make(3, 4);
1853 if you know the cartesian form of the number, or
1857 if you like. To create a number using the polar form, use either:
1859 $z = Math::Complex->emake(5, pi/3);
1860 $x = cplxe(5, pi/3);
1862 instead. The first argument is the modulus, the second is the angle
1863 (in radians, the full circle is 2*pi). (Mnemonic: C<e> is used as a
1864 notation for complex numbers in the polar form).
1866 It is possible to write:
1868 $x = cplxe(-3, pi/4);
1870 but that will be silently converted into C<[3,-3pi/4]>, since the
1871 modulus must be non-negative (it represents the distance to the origin
1872 in the complex plane).
1874 It is also possible to have a complex number as either argument of the
1875 C<make>, C<emake>, C<cplx>, and C<cplxe>: the appropriate component of
1876 the argument will be used.
1881 The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
1882 understand a single (string) argument of the forms
1890 in which case the appropriate cartesian and exponential components
1891 will be parsed from the string and used to create new complex numbers.
1892 The imaginary component and the theta, respectively, will default to zero.
1894 The C<new>, C<make>, C<emake>, C<cplx>, and C<cplxe> will also
1895 understand the case of no arguments: this means plain zero or (0, 0).
1899 When printed, a complex number is usually shown under its cartesian
1900 style I<a+bi>, but there are legitimate cases where the polar style
1901 I<[r,t]> is more appropriate. The process of converting the complex
1902 number into a string that can be displayed is known as I<stringification>.
1904 By calling the class method C<Math::Complex::display_format> and
1905 supplying either C<"polar"> or C<"cartesian"> as an argument, you
1906 override the default display style, which is C<"cartesian">. Not
1907 supplying any argument returns the current settings.
1909 This default can be overridden on a per-number basis by calling the
1910 C<display_format> method instead. As before, not supplying any argument
1911 returns the current display style for this number. Otherwise whatever you
1912 specify will be the new display style for I<this> particular number.
1918 Math::Complex::display_format('polar');
1919 $j = (root(1, 3))[1];
1920 print "j = $j\n"; # Prints "j = [1,2pi/3]"
1921 $j->display_format('cartesian');
1922 print "j = $j\n"; # Prints "j = -0.5+0.866025403784439i"
1924 The polar style attempts to emphasize arguments like I<k*pi/n>
1925 (where I<n> is a positive integer and I<k> an integer within [-9, +9]),
1926 this is called I<polar pretty-printing>.
1928 For the reverse of stringifying, see the C<make> and C<emake>.
1930 =head2 CHANGED IN PERL 5.6
1932 The C<display_format> class method and the corresponding
1933 C<display_format> object method can now be called using
1934 a parameter hash instead of just a one parameter.
1936 The old display format style, which can have values C<"cartesian"> or
1937 C<"polar">, can be changed using the C<"style"> parameter.
1939 $j->display_format(style => "polar");
1941 The one parameter calling convention also still works.
1943 $j->display_format("polar");
1945 There are two new display parameters.
1947 The first one is C<"format">, which is a sprintf()-style format string
1948 to be used for both numeric parts of the complex number(s). The is
1949 somewhat system-dependent but most often it corresponds to C<"%.15g">.
1950 You can revert to the default by setting the C<format> to C<undef>.
1952 # the $j from the above example
1954 $j->display_format('format' => '%.5f');
1955 print "j = $j\n"; # Prints "j = -0.50000+0.86603i"
1956 $j->display_format('format' => undef);
1957 print "j = $j\n"; # Prints "j = -0.5+0.86603i"
1959 Notice that this affects also the return values of the
1960 C<display_format> methods: in list context the whole parameter hash
1961 will be returned, as opposed to only the style parameter value.
1962 This is a potential incompatibility with earlier versions if you
1963 have been calling the C<display_format> method in list context.
1965 The second new display parameter is C<"polar_pretty_print">, which can
1966 be set to true or false, the default being true. See the previous
1967 section for what this means.
1971 Thanks to overloading, the handling of arithmetics with complex numbers
1972 is simple and almost transparent.
1974 Here are some examples:
1978 $j = cplxe(1, 2*pi/3); # $j ** 3 == 1
1979 print "j = $j, j**3 = ", $j ** 3, "\n";
1980 print "1 + j + j**2 = ", 1 + $j + $j**2, "\n";
1982 $z = -16 + 0*i; # Force it to be a complex
1983 print "sqrt($z) = ", sqrt($z), "\n";
1985 $k = exp(i * 2*pi/3);
1986 print "$j - $k = ", $j - $k, "\n";
1988 $z->Re(3); # Re, Im, arg, abs,
1989 $j->arg(2); # (the last two aka rho, theta)
1990 # can be used also as mutators.
1996 The constant C<pi> and some handy multiples of it (pi2, pi4,
1997 and pip2 (pi/2) and pip4 (pi/4)) are also available if separately
2000 use Math::Complex ':pi';
2001 $third_of_circle = pi2 / 3;
2005 The floating point infinity can be exported as a subroutine Inf():
2007 use Math::Complex qw(Inf sinh);
2008 my $AlsoInf = Inf() + 42;
2009 my $AnotherInf = sinh(1e42);
2010 print "$AlsoInf is $AnotherInf\n" if $AlsoInf == $AnotherInf;
2012 Note that the stringified form of infinity varies between platforms:
2013 it can be for example any of
2020 or it can be something else.
2022 Also note that in some platforms trying to use the infinity in
2023 arithmetic operations may result in Perl crashing because using
2024 an infinity causes SIGFPE or its moral equivalent to be sent.
2025 The way to ignore this is
2027 local $SIG{FPE} = sub { };
2029 =head1 ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
2031 The division (/) and the following functions
2037 atanh asech acsch acoth
2039 cannot be computed for all arguments because that would mean dividing
2040 by zero or taking logarithm of zero. These situations cause fatal
2041 runtime errors looking like this
2043 cot(0): Division by zero.
2044 (Because in the definition of cot(0), the divisor sin(0) is 0)
2049 atanh(-1): Logarithm of zero.
2052 For the C<csc>, C<cot>, C<asec>, C<acsc>, C<acot>, C<csch>, C<coth>,
2053 C<asech>, C<acsch>, the argument cannot be C<0> (zero). For the
2054 logarithmic functions and the C<atanh>, C<acoth>, the argument cannot
2055 be C<1> (one). For the C<atanh>, C<acoth>, the argument cannot be
2056 C<-1> (minus one). For the C<atan>, C<acot>, the argument cannot be
2057 C<i> (the imaginary unit). For the C<atan>, C<acoth>, the argument
2058 cannot be C<-i> (the negative imaginary unit). For the C<tan>,
2059 C<sec>, C<tanh>, the argument cannot be I<pi/2 + k * pi>, where I<k>
2060 is any integer. atan2(0, 0) is undefined, and if the complex arguments
2061 are used for atan2(), a division by zero will happen if z1**2+z2**2 == 0.
2063 Note that because we are operating on approximations of real numbers,
2064 these errors can happen when merely `too close' to the singularities
2067 =head1 ERRORS DUE TO INDIGESTIBLE ARGUMENTS
2069 The C<make> and C<emake> accept both real and complex arguments.
2070 When they cannot recognize the arguments they will die with error
2071 messages like the following
2073 Math::Complex::make: Cannot take real part of ...
2074 Math::Complex::make: Cannot take real part of ...
2075 Math::Complex::emake: Cannot take rho of ...
2076 Math::Complex::emake: Cannot take theta of ...
2080 Saying C<use Math::Complex;> exports many mathematical routines in the
2081 caller environment and even overrides some (C<sqrt>, C<log>, C<atan2>).
2082 This is construed as a feature by the Authors, actually... ;-)
2084 All routines expect to be given real or complex numbers. Don't attempt to
2085 use BigFloat, since Perl has currently no rule to disambiguate a '+'
2086 operation (for instance) between two overloaded entities.
2088 In Cray UNICOS there is some strange numerical instability that results
2089 in root(), cos(), sin(), cosh(), sinh(), losing accuracy fast. Beware.
2090 The bug may be in UNICOS math libs, in UNICOS C compiler, in Math::Complex.
2091 Whatever it is, it does not manifest itself anywhere else where Perl runs.
2099 Daniel S. Lewart <F<lewart!at!uiuc.edu>>,
2100 Jarkko Hietaniemi <F<jhi!at!iki.fi>>,
2101 Raphael Manfredi <F<Raphael_Manfredi!at!pobox.com>>,
2102 Zefram <zefram@fysh.org>
2106 This library is free software; you can redistribute it and/or modify
2107 it under the same terms as Perl itself.