5.004_02: Complex/Trig: update
Jarkko Hietaniemi [Fri, 5 Sep 1997 00:00:00 +0000 (00:00 +0000)]
The following patches do not fix actual grave errors but they do:

- make the code more robust (more discontinuities catched)
  (e.g. atan(-i), atanh(-1))
- make the results agree on signs and/or conjugate forms with the
  results MATLAB gives: the results were already correct thanks to
  the periodicity of trig funcs but now they are also consistent.
  (e.g. acos(x) did have an unnecessary discontinuity at x = 0)
- for some pure real arguments short-circuit the calculation
  to avoid rounding errors (which make epsilons appear where
  clear zeros should reign)

Tested on NetBSD 1.2G i686, Linux 2.0.25 i686, Digital UNIX 4.0 EV56.

p5p-msgid: 199708081842.VAA31214@alpha.hut.fi

lib/Math/Complex.pm
lib/Math/Trig.pm
t/lib/complex.t

index 7a4617c..33c6023 100644 (file)
@@ -511,6 +511,27 @@ sub exp {
 }
 
 #
+# _logofzero
+#
+# Die on division by zero.
+#
+sub _logofzero {
+    my $mess = "$_[0]: Logarithm of zero.\n";
+
+    if (defined $_[1]) {
+       $mess .= "(Because in the definition of $_[0], the argument ";
+       $mess .= "$_[1] " unless ($_[1] eq '0');
+       $mess .= "is 0)\n";
+    }
+
+    my @up = caller(1);
+    
+    $mess .= "Died at $up[1] line $up[2].\n";
+
+    die $mess;
+}
+
+#
 # (log)
 #
 # Compute log(z).
@@ -659,7 +680,19 @@ sub cotan { Math::Complex::cot(@_) }
 sub acos {
        my ($z) = @_;
        $z = cplx($z, 0) unless ref $z;
-       return ~i * log($z + (Re($z) * Im($z) > 0 ? 1 : -1) * sqrt($z*$z - 1));
+       my ($re, $im) = @{$z->cartesian};
+       return atan2(sqrt(1 - $re * $re), $re)
+           if ($im == 0 and abs($re) <= 1.0);
+       my $acos = ~i * log($z + sqrt($z*$z - 1));
+       if ($im == 0 ||
+           (abs($re) < 1 && abs($im) < 1) ||
+           (abs($re) > 1 && abs($im) > 1
+            && !($re >  1 && $im >  1)
+            && !($re < -1 && $im < -1))) {
+           # this rule really, REALLY, must be simpler
+           return -$acos;
+       }
+       return $acos;
 }
 
 #
@@ -670,6 +703,9 @@ sub acos {
 sub asin {
        my ($z) = @_;
        $z = cplx($z, 0) unless ref $z;
+       my ($re, $im) = @{$z->cartesian};
+       return atan2($re, sqrt(1 - $re * $re))
+           if ($im == 0 and abs($re) <= 1.0);
        return ~i * log(i * $z + sqrt(1 - $z*$z));
 }
 
@@ -681,7 +717,8 @@ sub asin {
 sub atan {
        my ($z) = @_;
        $z = cplx($z, 0) unless ref $z;
-       _divbyzero "atan($z)", "i - $z" if ($z == i);
+       _divbyzero "atan(i)"  if ( $z == i);
+       _divbyzero "atan(-i)" if (-$z == i);
        return i/2*log((i + $z) / (i - $z));
 }
 
@@ -693,18 +730,35 @@ sub atan {
 sub asec {
        my ($z) = @_;
        _divbyzero "asec($z)", $z if ($z == 0);
-       return acos(1 / $z);
+       $z = cplx($z, 0) unless ref $z;
+       my ($re, $im) = @{$z->cartesian};
+       if ($im == 0 && abs($re) >= 1.0) {
+           my $ire = 1 / $re;
+           return atan2(sqrt(1 - $ire * $ire), $ire);
+       }
+       my $asec = acos(1 / $z);
+       return ~$asec if $re < 0 && $re > -1 && $im == 0;
+       return -$asec if $im && !($re > 0 && $im > 0) && !($re < 0 && $im < 0);
+       return $asec;
 }
 
 #
 # acsc
 #
-# Computes the arc cosecant sec(z) = asin(1 / z).
+# Computes the arc cosecant acsc(z) = asin(1 / z).
 #
 sub acsc {
        my ($z) = @_;
        _divbyzero "acsc($z)", $z if ($z == 0);
-       return asin(1 / $z);
+       $z = cplx($z, 0) unless ref $z;
+       my ($re, $im) = @{$z->cartesian};
+       if ($im == 0 && abs($re) >= 1.0) {
+           my $ire = 1 / $re;
+           return atan2($ire, sqrt(1 - $ire * $ire));
+       }
+       my $acsc = asin(1 / $z);
+       return ~$acsc if $re < 0 && $re > -1 && $im == 0;
+       return $acsc;
 }
 
 #
@@ -717,13 +771,15 @@ sub acosec { Math::Complex::acsc(@_) }
 #
 # acot
 #
-# Computes the arc cotangent acot(z) = -i/2 log((i+z) / (z-i))
+# Computes the arc cotangent acot(z) = atan(1 / z)
 #
 sub acot {
        my ($z) = @_;
+       _divbyzero "acot($z)"           if ($z == 0);
        $z = cplx($z, 0) unless ref $z;
-       _divbyzero "acot($z)", "$z - i" if ($z == i);
-       return i/-2 * log((i + $z) / ($z - i));
+       _divbyzero "acot(i)", if ( $z == i);
+       _divbyzero "acot(-i)" if (-$z == i);
+       return atan(1 / $z);
 }
 
 #
@@ -838,11 +894,14 @@ sub cotanh { Math::Complex::coth(@_) }
 #
 # acosh
 #
-# Computes the arc hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)).
+# Computes the arc hyperbolic cosine acosh(z) = log(z +- sqrt(z*z-1)).
 #
 sub acosh {
        my ($z) = @_;
        $z = cplx($z, 0) unless ref $z;
+       my ($re, $im) = @{$z->cartesian};
+       return log($re + sqrt(cplx($re*$re - 1, 0)))
+           if ($im == 0 && $re < 0);
        return log($z + sqrt($z*$z - 1));
 }
 
@@ -864,10 +923,14 @@ sub asinh {
 #
 sub atanh {
        my ($z) = @_;
-       _divbyzero 'atanh(1)', "1 - $z" if ($z == 1);
+       _divbyzero 'atanh(1)',  "1 - $z" if ($z ==  1);
+       _logofzero 'atanh(-1)'           if ($z == -1);
        $z = cplx($z, 0) unless ref $z;
-       my $cz = (1 + $z) / (1 - $z);
-       return log($cz) / 2;
+       my ($re, $im) = @{$z->cartesian};
+       if ($im == 0 && $re > 1) {
+           return cplx(atanh(1 / $re), pi/2);
+       }
+       return log((1 + $z) / (1 - $z)) / 2;
 }
 
 #
@@ -878,6 +941,12 @@ sub atanh {
 sub asech {
        my ($z) = @_;
        _divbyzero 'asech(0)', $z if ($z == 0);
+       $z = cplx($z, 0) unless ref $z;
+       my ($re, $im) = @{$z->cartesian};
+       if ($im == 0 && $re < 0) {
+           my $ire = 1 / $re;
+           return log($ire + sqrt(cplx($ire*$ire - 1, 0)));
+       }
        return acosh(1 / $z);
 }
 
@@ -906,10 +975,14 @@ sub acosech { Math::Complex::acsch(@_) }
 #
 sub acoth {
        my ($z) = @_;
-       _divbyzero 'acoth(1)', "$z - 1" if ($z == 1);
+       _divbyzero 'acoth(1)', "$z - 1" if ($z ==  1);
+       _logofzero 'acoth(-1)'          if ($z == -1);
        $z = cplx($z, 0) unless ref $z;
-       my $cz = (1 + $z) / ($z - 1);
-       return log($cz) / 2;
+       my ($re, $im) = @{$z->cartesian};
+       if ($im == 0 and abs($re) < 1) {
+           return cplx(acoth(1/$re) , pi/2);
+       }
+       return log((1 + $z) / ($z - 1)) / 2;
 }
 
 #
@@ -1295,7 +1368,7 @@ numbers:
 
        acsc(z) = asin(1 / z)
        asec(z) = acos(1 / z)
-       acot(z) = -i/2 * log((i+z) / (z-i))
+       acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i))
 
        sinh(z) = 1/2 (exp(z) - exp(-z))
        cosh(z) = 1/2 (exp(z) + exp(-z))
@@ -1437,18 +1510,26 @@ The division (/) and the following functions
        acoth
 
 cannot be computed for all arguments because that would mean dividing
-by zero. These situations cause fatal runtime errors looking like this
+by zero or taking logarithm of zero. These situations cause fatal
+runtime errors looking like this
 
        cot(0): Division by zero.
        (Because in the definition of cot(0), the divisor sin(0) is 0)
        Died at ...
 
-For the C<csc>, C<cot>, C<asec>, C<acsc>, C<csch>, C<coth>, C<asech>,
-C<acsch>, the argument cannot be C<0> (zero). For the C<atanh>,
-C<acoth>, the argument cannot be C<1> (one). For the C<atan>, C<acot>,
-the argument cannot be C<i> (the imaginary unit).  For the C<tan>,
-C<sec>, C<tanh>, C<sech>, the argument cannot be I<pi/2 + k * pi>, where
-I<k> is any integer.
+or
+
+       atanh(-1): Logarithm of zero.
+       Died at...
+
+For the C<csc>, C<cot>, C<asec>, C<acsc>, C<acot>, C<csch>, C<coth>,
+C<asech>, C<acsch>, the argument cannot be C<0> (zero).  For the
+C<atanh>, C<acoth>, the argument cannot be C<1> (one).  For the
+C<atanh>, C<acoth>, the argument cannot be C<-1> (minus one).  For the
+C<atan>, C<acot>, the argument cannot be C<i> (the imaginary unit).
+For the C<atan>, C<acoth>, the argument cannot be C<-i> (the negative
+imaginary unit).  For the C<tan>, C<sec>, C<tanh>, C<sech>, the
+argument cannot be I<pi/2 + k * pi>, where I<k> is any integer.
 
 =head1 BUGS
 
index c9c045d..a1cbb07 100644 (file)
@@ -150,17 +150,24 @@ The following functions
        acoth
 
 cannot be computed for all arguments because that would mean dividing
-by zero. These situations cause fatal runtime errors looking like this
+by zero or taking logarithm of zero. These situations cause fatal
+runtime errors looking like this
 
        cot(0): Division by zero.
        (Because in the definition of cot(0), the divisor sin(0) is 0)
        Died at ...
 
-For the C<csc>, C<cot>, C<asec>, C<acsc>, C<csch>, C<coth>, C<asech>,
-C<acsch>, the argument cannot be C<0> (zero). For the C<atanh>,
-C<acoth>, the argument cannot be C<1> (one). For the C<tan>, C<sec>,
-C<tanh>, C<sech>, the argument cannot be I<pi/2 + k * pi>, where I<k> is
-any integer.
+or
+
+       atanh(-1): Logarithm of zero.
+       Died at...
+
+For the C<csc>, C<cot>, C<asec>, C<acsc>, C<acot>, C<csch>, C<coth>,
+C<asech>, C<acsch>, the argument cannot be C<0> (zero).  For the
+C<atanh>, C<acoth>, the argument cannot be C<1> (one).  For the
+C<atanh>, C<acoth>, the argument cannot be C<-1> (minus one).  For the
+C<tan>, C<sec>, C<tanh>, C<sech>, the argument cannot be I<pi/2 + k *
+pi>, where I<k> is any integer.
 
 =head2 SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS
 
index 80a5625..c05f40f 100755 (executable)
@@ -62,6 +62,21 @@ sub test_dbz {
     }
 }
 
+# test the logofzeros
+
+sub test_loz {
+    for my $op (@_) {
+       $test++;
+
+#      push(@script, qq(print "# '$op'\n";));
+       push(@script, qq(eval '$op';));
+       push(@script, qq(print 'not ' unless (\$@ =~ /Logarithm of zero/);));
+       push(@script, qq(print "ok $test\n";));
+    }
+}
+
+my $minusi = cplx(0, -1);
+
 test_dbz(
         'i/0',
 #       'tan(pi/2)',   # may succeed thanks to floating point inaccuracies
@@ -69,9 +84,11 @@ test_dbz(
         'csc(0)',
         'cot(0)',
         'atan(i)',
+        'atan($minusi)',
         'asec(0)',
         'acsc(0)',
         'acot(i)',
+        'acot($minusi)',
 #       'tanh(pi/2)',  # may succeed thanks to floating point inaccuracies
 #       'sech(pi/2)',  # may succeed thanks to floating point inaccuracies
         'csch(0)',
@@ -79,7 +96,12 @@ test_dbz(
         'atanh(1)',
         'asech(0)',
         'acsch(0)',
-        'acoth(1)'
+        'acoth(1)',
+       );
+
+test_loz(
+        'atanh(-1)',
+        'acoth(-1)',
        );
 
 # test the 0**0
@@ -342,7 +364,7 @@ __END__
 |'z - ~z':'2*i*Im(z)'
 |'z * ~z':'abs(z) * abs(z)'
 
-{ (2,3); [3,2]; (-3,2); (0,2); 3; 1.2; (-3, 0); (-2, -1); [2,1] }
+{ (0.5, 0); (-0.5, 0); (2,3); [3,2]; (-3,2); (0,2); 3; 1.2; (-3, 0); (-2, -1); [2,1] }
 
 |'(root(z, 4))[1] ** 4':'z'
 |'(root(z, 5))[3] ** 5':'z'
@@ -350,8 +372,8 @@ __END__
 |'abs(z)':'r'
 |'acot(z)':'acotan(z)'
 |'acsc(z)':'acosec(z)'
-|'acsc(z)':'asin(1 / z)'
-|'asec(z)':'acos(1 / z)'
+|'abs(acsc(z))':'abs(asin(1 / z))'
+|'abs(asec(z))':'abs(acos(1 / z))'
 |'cbrt(z)':'cbrt(r) * exp(i * t/3)'
 |'cos(acos(z))':'z'
 |'cos(z) ** 2 + sin(z) ** 2':1
@@ -409,144 +431,346 @@ __END__
 |'atanh(tanh(z))':'z'
 
 &sin
+(-2.0,0):(  -0.90929742682568,  0               )
+(-1.0,0):(  -0.84147098480790,  0               )
+(-0.5,0):(  -0.47942553860420,  0               )
+( 0.0,0):(   0               ,  0               )
+( 0.5,0):(   0.47942553860420,  0               )
+( 1.0,0):(   0.84147098480790,  0               )
+( 2.0,0):(   0.90929742682568,  0               )
+
+&sin
 ( 2, 3):(  9.15449914691143, -4.16890695996656)
 (-2, 3):( -9.15449914691143, -4.16890695996656)
 (-2,-3):( -9.15449914691143,  4.16890695996656)
 ( 2,-3):(  9.15449914691143,  4.16890695996656)
 
 &cos
+(-2.0,0):(  -0.41614683654714,  0               )
+(-1.0,0):(   0.54030230586814,  0               )
+(-0.5,0):(   0.87758256189037,  0               )
+( 0.0,0):(   1               ,  0               )
+( 0.5,0):(   0.87758256189037,  0               )
+( 1.0,0):(   0.54030230586814,  0               )
+( 2.0,0):(  -0.41614683654714,  0               )
+
+&cos
 ( 2, 3):( -4.18962569096881, -9.10922789375534)
 (-2, 3):( -4.18962569096881,  9.10922789375534)
 (-2,-3):( -4.18962569096881, -9.10922789375534)
 ( 2,-3):( -4.18962569096881,  9.10922789375534)
 
 &tan
+(-2.0,0):(   2.18503986326152,  0               )
+(-1.0,0):(  -1.55740772465490,  0               )
+(-0.5,0):(  -0.54630248984379,  0               )
+( 0.0,0):(   0               ,  0               )
+( 0.5,0):(   0.54630248984379,  0               )
+( 1.0,0):(   1.55740772465490,  0               )
+( 2.0,0):(  -2.18503986326152,  0               )
+
+&tan
 ( 2, 3):( -0.00376402564150,  1.00323862735361)
 (-2, 3):(  0.00376402564150,  1.00323862735361)
 (-2,-3):(  0.00376402564150, -1.00323862735361)
 ( 2,-3):( -0.00376402564150, -1.00323862735361)
 
 &sec
+(-2.0,0):(  -2.40299796172238,  0               )
+(-1.0,0):(   1.85081571768093,  0               )
+(-0.5,0):(   1.13949392732455,  0               )
+( 0.0,0):(   1               ,  0               )
+( 0.5,0):(   1.13949392732455,  0               )
+( 1.0,0):(   1.85081571768093,  0               )
+( 2.0,0):(  -2.40299796172238,  0               )
+
+&sec
 ( 2, 3):( -0.04167496441114,  0.09061113719624)
 (-2, 3):( -0.04167496441114, -0.09061113719624)
 (-2,-3):( -0.04167496441114,  0.09061113719624)
 ( 2,-3):( -0.04167496441114, -0.09061113719624)
 
 &csc
+(-2.0,0):(  -1.09975017029462,  0               )
+(-1.0,0):(  -1.18839510577812,  0               )
+(-0.5,0):(  -2.08582964293349,  0               )
+( 0.5,0):(   2.08582964293349,  0               )
+( 1.0,0):(   1.18839510577812,  0               )
+( 2.0,0):(   1.09975017029462,  0               )
+
+&csc
 ( 2, 3):(  0.09047320975321,  0.04120098628857)
 (-2, 3):( -0.09047320975321,  0.04120098628857)
 (-2,-3):( -0.09047320975321, -0.04120098628857)
 ( 2,-3):(  0.09047320975321, -0.04120098628857)
 
 &cot
+(-2.0,0):(   0.45765755436029,  0               )
+(-1.0,0):(  -0.64209261593433,  0               )
+(-0.5,0):(  -1.83048772171245,  0               )
+( 0.5,0):(   1.83048772171245,  0               )
+( 1.0,0):(   0.64209261593433,  0               )
+( 2.0,0):(  -0.45765755436029,  0               )
+
+&cot
 ( 2, 3):( -0.00373971037634, -0.99675779656936)
 (-2, 3):(  0.00373971037634, -0.99675779656936)
 (-2,-3):(  0.00373971037634,  0.99675779656936)
 ( 2,-3):( -0.00373971037634,  0.99675779656936)
 
 &asin
+(-2.0,0):(  -1.57079632679490,  1.31695789692482)
+(-1.0,0):(  -1.57079632679490,  0               )
+(-0.5,0):(  -0.52359877559830,  0               )
+( 0.0,0):(   0               ,  0               )
+( 0.5,0):(   0.52359877559830,  0               )
+( 1.0,0):(   1.57079632679490,  0               )
+( 2.0,0):(   1.57079632679490, -1.31695789692482)
+
+&asin
 ( 2, 3):(  0.57065278432110,  1.98338702991654)
 (-2, 3):( -0.57065278432110,  1.98338702991654)
 (-2,-3):( -0.57065278432110, -1.98338702991654)
 ( 2,-3):(  0.57065278432110, -1.98338702991654)
 
 &acos
+(-2.0,0):(   3.14159265358979, -1.31695789692482)
+(-1.0,0):(   3.14159265358979,  0               )
+(-0.5,0):(   2.09439510239320,  0               )
+( 0.0,0):(   1.57079632679490,  0               )
+( 0.5,0):(   1.04719755119660,  0               )
+( 1.0,0):(   0               ,  0               )
+( 2.0,0):(   0               ,  1.31695789692482)
+
+&acos
 ( 2, 3):(  1.00014354247380, -1.98338702991654)
 (-2, 3):(  2.14144911111600, -1.98338702991654)
 (-2,-3):(  2.14144911111600,  1.98338702991654)
 ( 2,-3):(  1.00014354247380,  1.98338702991654)
 
 &atan
+(-2.0,0):(  -1.10714871779409,  0               )
+(-1.0,0):(  -0.78539816339745,  0               )
+(-0.5,0):(  -0.46364760900081,  0               )
+( 0.0,0):(   0               ,  0               )
+( 0.5,0):(   0.46364760900081,  0               )
+( 1.0,0):(   0.78539816339745,  0               )
+( 2.0,0):(   1.10714871779409,  0               )
+
+&atan
 ( 2, 3):(  1.40992104959658,  0.22907268296854)
 (-2, 3):( -1.40992104959658,  0.22907268296854)
 (-2,-3):( -1.40992104959658, -0.22907268296854)
 ( 2,-3):(  1.40992104959658, -0.22907268296854)
 
 &asec
+(-2.0,0):(   2.09439510239320,  0               )
+(-1.0,0):(   3.14159265358979,  0               )
+(-0.5,0):(   3.14159265358979, -1.31695789692482)
+( 0.5,0):(   0               ,  1.31695789692482)
+( 1.0,0):(   0               ,  0               )
+( 2.0,0):(   1.04719755119660,  0               )
+
+&asec
 ( 2, 3):(  1.42041072246703,  0.23133469857397)
 (-2, 3):(  1.72118193112276,  0.23133469857397)
 (-2,-3):(  1.72118193112276, -0.23133469857397)
 ( 2,-3):(  1.42041072246703, -0.23133469857397)
 
 &acsc
+(-2.0,0):(  -0.52359877559830,  0               )
+(-1.0,0):(  -1.57079632679490,  0               )
+(-0.5,0):(  -1.57079632679490,  1.31695789692482)
+( 0.5,0):(   1.57079632679490, -1.31695789692482)
+( 1.0,0):(   1.57079632679490,  0               )
+( 2.0,0):(   0.52359877559830,  0               )
+
+&acsc
 ( 2, 3):(  0.15038560432786, -0.23133469857397)
 (-2, 3):( -0.15038560432786, -0.23133469857397)
 (-2,-3):( -0.15038560432786,  0.23133469857397)
 ( 2,-3):(  0.15038560432786,  0.23133469857397)
 
 &acot
+(-2.0,0):(  -0.46364760900081,  0               )
+(-1.0,0):(  -0.78539816339745,  0               )
+(-0.5,0):(  -1.10714871779409,  0               )
+( 0.5,0):(   1.10714871779409,  0               )
+( 1.0,0):(   0.78539816339745,  0               )
+( 2.0,0):(   0.46364760900081,  0               )
+
+&acot
 ( 2, 3):(  0.16087527719832, -0.22907268296854)
 (-2, 3):( -0.16087527719832, -0.22907268296854)
 (-2,-3):( -0.16087527719832,  0.22907268296854)
 ( 2,-3):(  0.16087527719832,  0.22907268296854)
 
 &sinh
+(-2.0,0):(  -3.62686040784702,  0               )
+(-1.0,0):(  -1.17520119364380,  0               )
+(-0.5,0):(  -0.52109530549375,  0               )
+( 0.0,0):(   0               ,  0               )
+( 0.5,0):(   0.52109530549375,  0               )
+( 1.0,0):(   1.17520119364380,  0               )
+( 2.0,0):(   3.62686040784702,  0               )
+
+&sinh
 ( 2, 3):( -3.59056458998578,  0.53092108624852)
 (-2, 3):(  3.59056458998578,  0.53092108624852)
 (-2,-3):(  3.59056458998578, -0.53092108624852)
 ( 2,-3):( -3.59056458998578, -0.53092108624852)
 
 &cosh
+(-2.0,0):(   3.76219569108363,  0               )
+(-1.0,0):(   1.54308063481524,  0               )
+(-0.5,0):(   1.12762596520638,  0               )
+( 0.0,0):(   1               ,  0               )
+( 0.5,0):(   1.12762596520638,  0               )
+( 1.0,0):(   1.54308063481524,  0               )
+( 2.0,0):(   3.76219569108363,  0               )
+
+&cosh
 ( 2, 3):( -3.72454550491532,  0.51182256998738)
 (-2, 3):( -3.72454550491532, -0.51182256998738)
 (-2,-3):( -3.72454550491532,  0.51182256998738)
 ( 2,-3):( -3.72454550491532, -0.51182256998738)
 
 &tanh
+(-2.0,0):(  -0.96402758007582,  0               )
+(-1.0,0):(  -0.76159415595576,  0               )
+(-0.5,0):(  -0.46211715726001,  0               )
+( 0.0,0):(   0               ,  0               )
+( 0.5,0):(   0.46211715726001,  0               )
+( 1.0,0):(   0.76159415595576,  0               )
+( 2.0,0):(   0.96402758007582,  0               )
+
+&tanh
 ( 2, 3):(  0.96538587902213, -0.00988437503832)
 (-2, 3):( -0.96538587902213, -0.00988437503832)
 (-2,-3):( -0.96538587902213,  0.00988437503832)
 ( 2,-3):(  0.96538587902213,  0.00988437503832)
 
 &sech
+(-2.0,0):(   0.26580222883408,  0               )
+(-1.0,0):(   0.64805427366389,  0               )
+(-0.5,0):(   0.88681888397007,  0               )
+( 0.0,0):(   1               ,  0               )
+( 0.5,0):(   0.88681888397007,  0               )
+( 1.0,0):(   0.64805427366389,  0               )
+( 2.0,0):(   0.26580222883408,  0               )
+
+&sech
 ( 2, 3):( -0.26351297515839, -0.03621163655877)
 (-2, 3):( -0.26351297515839,  0.03621163655877)
 (-2,-3):( -0.26351297515839, -0.03621163655877)
 ( 2,-3):( -0.26351297515839,  0.03621163655877)
 
 &csch
+(-2.0,0):(  -0.27572056477178,  0               )
+(-1.0,0):(  -0.85091812823932,  0               )
+(-0.5,0):(  -1.91903475133494,  0               )
+( 0.5,0):(   1.91903475133494,  0               )
+( 1.0,0):(   0.85091812823932,  0               )
+( 2.0,0):(   0.27572056477178,  0               )
+
+&csch
 ( 2, 3):( -0.27254866146294, -0.04030057885689)
 (-2, 3):(  0.27254866146294, -0.04030057885689)
 (-2,-3):(  0.27254866146294,  0.04030057885689)
 ( 2,-3):( -0.27254866146294,  0.04030057885689)
 
 &coth
+(-2.0,0):(  -1.03731472072755,  0               )
+(-1.0,0):(  -1.31303528549933,  0               )
+(-0.5,0):(  -2.16395341373865,  0               )
+( 0.5,0):(   2.16395341373865,  0               )
+( 1.0,0):(   1.31303528549933,  0               )
+( 2.0,0):(   1.03731472072755,  0               )
+
+&coth
 ( 2, 3):(  1.03574663776500,  0.01060478347034)
 (-2, 3):( -1.03574663776500,  0.01060478347034)
 (-2,-3):( -1.03574663776500, -0.01060478347034)
 ( 2,-3):(  1.03574663776500, -0.01060478347034)
 
 &asinh
+(-2.0,0):(  -1.44363547517881,  0               )
+(-1.0,0):(  -0.88137358701954,  0               )
+(-0.5,0):(  -0.48121182505960,  0               )
+( 0.0,0):(   0               ,  0               )
+( 0.5,0):(   0.48121182505960,  0               )
+( 1.0,0):(   0.88137358701954,  0               )
+( 2.0,0):(   1.44363547517881,  0               )
+
+&asinh
 ( 2, 3):(  1.96863792579310,  0.96465850440760)
 (-2, 3):( -1.96863792579310,  0.96465850440761)
 (-2,-3):( -1.96863792579310, -0.96465850440761)
 ( 2,-3):(  1.96863792579310, -0.96465850440760)
 
 &acosh
+(-2.0,0):(  -1.31695789692482,  3.14159265358979)
+(-1.0,0):(   0,                 3.14159265358979)
+(-0.5,0):(   0,                 2.09439510239320)
+( 0.0,0):(   0,                 1.57079632679490)
+( 0.5,0):(   0,                 1.04719755119660)
+( 1.0,0):(   0               ,  0               )
+( 2.0,0):(   1.31695789692482,  0               )
+
+&acosh
 ( 2, 3):(  1.98338702991654,  1.00014354247380)
 (-2, 3):( -1.98338702991653, -2.14144911111600)
 (-2,-3):( -1.98338702991653,  2.14144911111600)
 ( 2,-3):(  1.98338702991654, -1.00014354247380)
 
 &atanh
+(-2.0,0):(  -0.54930614433405,  1.57079632679490)
+(-0.5,0):(  -0.54930614433405,  0               )
+( 0.0,0):(   0               ,  0               )
+( 0.5,0):(   0.54930614433405,  0               )
+( 2.0,0):(   0.54930614433405,  1.57079632679490)
+
+&atanh
 ( 2, 3):(  0.14694666622553,  1.33897252229449)
 (-2, 3):( -0.14694666622553,  1.33897252229449)
 (-2,-3):( -0.14694666622553, -1.33897252229449)
 ( 2,-3):(  0.14694666622553, -1.33897252229449)
 
 &asech
+(-2.0,0):(   0               , 2.09439510239320)
+(-1.0,0):(   0               , 3.14159265358979)
+(-0.5,0):(  -1.31695789692482, 3.14159265358979)
+( 0.5,0):(   1.31695789692482, 0               )
+( 1.0,0):(   0               , 0               )
+( 2.0,0):(   0               , 1.04719755119660)
+
+&asech
 ( 2, 3):(  0.23133469857397, -1.42041072246703)
 (-2, 3):( -0.23133469857397,  1.72118193112276)
 (-2,-3):( -0.23133469857397, -1.72118193112276)
 ( 2,-3):(  0.23133469857397,  1.42041072246703)
 
 &acsch
+(-2.0,0):(  -0.48121182505960, 0               )
+(-1.0,0):(  -0.88137358701954, 0               )
+(-0.5,0):(  -1.44363547517881, 0               )
+( 0.5,0):(   1.44363547517881, 0               )
+( 1.0,0):(   0.88137358701954, 0               )
+( 2.0,0):(   0.48121182505960, 0               )
+
+&acsch
 ( 2, 3):(  0.15735549884499, -0.22996290237721)
 (-2, 3):( -0.15735549884499, -0.22996290237721)
 (-2,-3):( -0.15735549884499,  0.22996290237721)
 ( 2,-3):(  0.15735549884499,  0.22996290237721)
 
 &acoth
+(-2.0,0):(  -0.54930614433405, 0               )
+(-0.5,0):(  -0.54930614433405, 1.57079632679490)
+( 0.5,0):(   0.54930614433405, 1.57079632679490)
+( 2.0,0):(   0.54930614433405, 0               )
+
+&acoth
 ( 2, 3):(  0.14694666622553, -0.23182380450040)
 (-2, 3):( -0.14694666622553, -0.23182380450040)
 (-2,-3):( -0.14694666622553,  0.23182380450040)