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/05 16:50:40 UTC

[commons-numbers] 06/08: Fix sinh conjugate and odd equality for infinite real, finite imaginary.

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

commit 5af4d3c2ad599fa28a0b7f9a67eda34e1aa682e6
Author: aherbert <ah...@apache.org>
AuthorDate: Thu Dec 5 12:36:59 2019 +0000

    Fix sinh conjugate and odd equality for infinite real, finite imaginary.
---
 .../java/org/apache/commons/numbers/complex/Complex.java  | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 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 aa169e5..f0efa8b 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
@@ -1511,9 +1511,16 @@ public final class Complex implements Serializable  {
                     return constructor.create(real, imaginary);
                 }
                 // inf * cis(y)
-                final double re = real * Math.cos(imaginary);
-                final double im = real * Math.sin(imaginary);
-                return constructor.create(re, im);
+                // ISO C99: Preserve the equality
+                // sinh(conj(z)) = conj(sinh(z))
+                // and the odd function: f(z) = -f(-z)
+                // by always computing on a positive valued Complex number.
+                // Math.cos(-x) == Math.cos(x) so ignore sign transform.
+                final double signIm = imaginary < 0 ? -1 : 1;
+                final double re = Double.POSITIVE_INFINITY * Math.cos(imaginary);
+                final double im = Double.POSITIVE_INFINITY * Math.sin(imaginary * signIm);
+                // Transform back
+                return constructor.create(real < 0 ? -re : re, im * signIm);
             }
             // imaginary is infinite or NaN
             return constructor.create(Double.POSITIVE_INFINITY, Double.NaN);
@@ -1879,7 +1886,7 @@ public final class Complex implements Serializable  {
      * <pre>
      * real    imaginary    g(z)
      * +       +            identity
-     * -       +            negateReal
+     * -       +            negateReal (negate && conjugate)
      * +       -            conjugate
      * -       -            negate
      * </pre>