You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2019/12/10 16:51:16 UTC

[commons-numbers] branch master updated: Use identities for tanh() with real / imaginary parts of zero.

This is an automated email from the ASF dual-hosted git repository.

aherbert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-numbers.git


The following commit(s) were added to refs/heads/master by this push:
     new 9b3c706  Use identities for tanh() with real / imaginary parts of zero.
9b3c706 is described below

commit 9b3c706a83cf7d46589af344e14ccdaa0d4cd8b8
Author: aherbert <ah...@apache.org>
AuthorDate: Tue Dec 10 16:51:12 2019 +0000

    Use identities for tanh() with real / imaginary parts of zero.
    
    real only the formula reduces to:
    sinh x / (1 + cosh x) = tanh(x/2)
    
    imaginary only the formula reduces to:
    sin x / (1 + cos x) = tan(x/2)
---
 .../main/java/org/apache/commons/numbers/complex/Complex.java | 11 ++++++++++-
 .../org/apache/commons/numbers/complex/CReferenceTest.java    |  2 +-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java b/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java
index f6f4681..c9cd5ea 100644
--- a/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java
+++ b/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java
@@ -1816,13 +1816,22 @@ public final class Complex implements Serializable  {
      */
     private static Complex tanh(double real, double imaginary, ComplexConstructor constructor) {
         // Math.cos and Math.sin return NaN for infinity.
-        // Perform edge-condition checks on the twice the imaginary value.
+        // Perform edge-condition checks on twice the imaginary value.
         // This handles very big imaginary numbers as infinite.
 
         final double imaginary2 = 2 * imaginary;
 
         if (Double.isFinite(real)) {
             if (Double.isFinite(imaginary2)) {
+                if (real == 0) {
+                    // Identity: sin x / (1 + cos x) = tan(x/2)
+                    return constructor.create(real, Math.tan(imaginary));
+                }
+                if (imaginary == 0) {
+                    // Identity: sinh x / (1 + cosh x) = tanh(x/2)
+                    return constructor.create(Math.tanh(real), imaginary);
+                }
+
                 final double real2 = 2 * real;
 
                 // Math.cosh returns positive infinity for infinity.
diff --git a/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/CReferenceTest.java b/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/CReferenceTest.java
index caddc73..e11a4e3 100644
--- a/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/CReferenceTest.java
+++ b/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/CReferenceTest.java
@@ -302,7 +302,7 @@ public class CReferenceTest {
     @Test
     public void testTanh() {
         // Odd function: negative real cases defined by positive real cases
-        assertOperation("tanh", Complex::tanh, 34);
+        assertOperation("tanh", Complex::tanh, 3);
     }
 
     @Test