NUMBERS-13: atanh() passes all tests
Project: http://git-wip-us.apache.org/repos/asf/commons-numbers/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-numbers/commit/a9437c90 Tree: http://git-wip-us.apache.org/repos/asf/commons-numbers/tree/a9437c90 Diff: http://git-wip-us.apache.org/repos/asf/commons-numbers/diff/a9437c90 Branch: refs/heads/master Commit: a9437c90666ca8c3045f1d59de1b77e536addba6 Parents: af5fc05 Author: Eric Barnhill <ericbarnh...@apache.org> Authored: Fri Jul 28 13:24:12 2017 +0200 Committer: Eric Barnhill <ericbarnh...@apache.org> Committed: Fri Jul 28 13:24:12 2017 +0200 ---------------------------------------------------------------------- .../apache/commons/numbers/complex/Complex.java | 75 +++++++++++--------- .../commons/numbers/complex/CStandardTest.java | 4 +- 2 files changed, 44 insertions(+), 35 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a9437c90/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java ---------------------------------------------------------------------- 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 fc3ff93..5a77a9f 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 @@ -641,7 +641,7 @@ in the * @return the inverse cosine of this complex number. */ public Complex acos() { - if (real == 0 && Double.isNaN(imaginary)) { + if (real == 0.0&& Double.isNaN(imaginary)) { return new Complex(Math.PI * 0.5, Double.NaN); } else if (neitherInfiniteNorZeroNorNaN(real) && imaginary == Double.POSITIVE_INFINITY) { return new Complex(Math.PI * 0.5, Double.NEGATIVE_INFINITY); @@ -704,13 +704,13 @@ in the if (neitherInfiniteNorZeroNorNaN(real) && imaginary == Double.POSITIVE_INFINITY) { return new Complex(Double.POSITIVE_INFINITY, Math.PI * 0.5); } else if (real == Double.POSITIVE_INFINITY && !Double.isInfinite(imaginary) && !Double.isNaN(imaginary)) { - return new Complex(Double.POSITIVE_INFINITY, 0); + return new Complex(Double.POSITIVE_INFINITY, 0.0); } else if (real == Double.POSITIVE_INFINITY && imaginary == Double.POSITIVE_INFINITY) { return new Complex(Double.POSITIVE_INFINITY, Math.PI * 0.25); } else if (real == Double.POSITIVE_INFINITY && Double.isNaN(imaginary)) { return new Complex(Double.POSITIVE_INFINITY, Double.NaN); - } else if (Double.isNaN(real) && imaginary == 0) { - return new Complex(Double.NaN, 0); + } else if (Double.isNaN(real) && imaginary == 0.0) { + return new Complex(Double.NaN, 0.0); } else if (Double.isNaN(real) && imaginary == Double.POSITIVE_INFINITY) { return new Complex(Double.POSITIVE_INFINITY, Double.NaN); } @@ -729,10 +729,10 @@ in the * @since 1.2 */ public Complex atanh(){ - if (real == 0 && Double.isNaN(imaginary)) { + if (real == 0.0 && Double.isNaN(imaginary)) { return new Complex(0, Double.NaN); - } else if (neitherInfiniteNorZeroNorNaN(real) && imaginary == 0) { - return new Complex(Double.POSITIVE_INFINITY, 0); + } else if (neitherInfiniteNorZeroNorNaN(real) && imaginary == 0.0) { + return new Complex(Double.POSITIVE_INFINITY, 0.0); } else if (neitherInfiniteNorZeroNorNaN(real) && imaginary == Double.POSITIVE_INFINITY) { return new Complex(0, Math.PI*0.5); } else if (real == Double.POSITIVE_INFINITY && neitherInfiniteNorZeroNorNaN(imaginary)) { @@ -808,18 +808,18 @@ in the * @return the hyperbolic cosine of this complex number. */ public Complex cosh() { - if (real == 0 && imaginary == Double.POSITIVE_INFINITY) { - return new Complex(Double.NaN, 0); - } else if (real == 0 && Double.isNaN(imaginary)) { - return new Complex(Double.NaN, 0); - } else if (real == Double.POSITIVE_INFINITY && imaginary == 0) { - return new Complex(Double.POSITIVE_INFINITY, 0); + if (real == 0.0&& imaginary == Double.POSITIVE_INFINITY) { + return new Complex(Double.NaN, 0.0); + } else if (real == 0.0&& Double.isNaN(imaginary)) { + return new Complex(Double.NaN, 0.0); + } else if (real == Double.POSITIVE_INFINITY && imaginary == 0.0) { + return new Complex(Double.POSITIVE_INFINITY, 0.0); } else if (real == Double.POSITIVE_INFINITY && imaginary == Double.POSITIVE_INFINITY) { return new Complex(Double.POSITIVE_INFINITY, Double.NaN); } else if (real == Double.POSITIVE_INFINITY && Double.isNaN(imaginary)) { return new Complex(Double.POSITIVE_INFINITY, Double.NaN); - } else if (Double.isNaN(real) && imaginary == 0) { - return new Complex(Double.NaN, 0); + } else if (Double.isNaN(real) && imaginary == 0.0) { + return new Complex(Double.NaN, 0.0); } return new Complex(Math.cosh(real) * Math.cos(imaginary), @@ -843,8 +843,8 @@ in the * @return <code><i>e</i><sup>this</sup></code>. */ public Complex exp() { - if (real == Double.POSITIVE_INFINITY && imaginary == 0) { - return new Complex(Double.POSITIVE_INFINITY, 0); + if (real == Double.POSITIVE_INFINITY && imaginary == 0.0) { + return new Complex(Double.POSITIVE_INFINITY, 0.0); } else if (real == Double.NEGATIVE_INFINITY && imaginary == Double.POSITIVE_INFINITY) { return Complex.ZERO; } else if (real == Double.POSITIVE_INFINITY && imaginary == Double.POSITIVE_INFINITY) { @@ -853,8 +853,8 @@ in the return Complex.ZERO; } else if (real == Double.POSITIVE_INFINITY && Double.isNaN(imaginary)) { return new Complex(Double.POSITIVE_INFINITY, Double.NaN); - } else if (Double.isNaN(real) && imaginary == 0) { - return new Complex(Double.NaN, 0); + } else if (Double.isNaN(real) && imaginary == 0.0) { + return new Complex(Double.NaN, 0.0); } double expReal = Math.exp(real); return new Complex(expReal * Math.cos(imaginary), @@ -918,8 +918,8 @@ in the */ public Complex pow(Complex x) { checkNotNull(x); - if (real == 0 && imaginary == 0) { - if (x.real > 0 && x.imaginary == 0) { + if (real == 0.0&& imaginary == 0.0) { + if (x.real > 0 && x.imaginary == 0.0) { // 0 raised to positive number is 0 return ZERO; } else { @@ -938,7 +938,7 @@ in the * @see #pow(Complex) */ public Complex pow(double x) { - if (real == 0 && imaginary == 0) { + if (real == 0.0&& imaginary == 0.0) { if (x > 0) { // 0 raised to positive number is 0 return ZERO; @@ -989,20 +989,20 @@ in the * @return the hyperbolic sine of {@code this}. */ public Complex sinh() { - if (real == 0 && imaginary == 0) { + if (real == 0.0&& imaginary == 0.0) { return Complex.ZERO; - } else if (real == 0 && imaginary == Double.POSITIVE_INFINITY) { + } else if (real == 0.0&& imaginary == Double.POSITIVE_INFINITY) { return new Complex(0, Double.NaN); - } else if (real == 0 && Double.isNaN(imaginary)) { + } else if (real == 0.0&& Double.isNaN(imaginary)) { return new Complex(0, Double.NaN); - } else if (real == Double.POSITIVE_INFINITY && imaginary == 0) { - return new Complex(Double.POSITIVE_INFINITY, 0); + } else if (real == Double.POSITIVE_INFINITY && imaginary == 0.0) { + return new Complex(Double.POSITIVE_INFINITY, 0.0); } else if (real == Double.POSITIVE_INFINITY && imaginary == Double.POSITIVE_INFINITY) { return new Complex(Double.POSITIVE_INFINITY, Double.NaN); } else if (real == Double.POSITIVE_INFINITY && Double.isNaN(imaginary)) { return new Complex(Double.POSITIVE_INFINITY, Double.NaN); - } else if (Double.isNaN(real) && imaginary == 0) { - return new Complex(Double.NaN, 0); + } else if (Double.isNaN(real) && imaginary == 0.0) { + return new Complex(Double.NaN, 0.0); } return new Complex(Math.sinh(real) * Math.cos(imaginary), Math.cosh(real) * Math.sin(imaginary)); @@ -1028,6 +1028,14 @@ in the public Complex sqrt() { if (real == 0.0 && imaginary == 0.0) { return new Complex(0.0, 0.0); + } else if (neitherInfiniteNorZeroNorNaN(real) && imaginary == Double.POSITIVE_INFINITY) { + return new Complex(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY); + } else if (real == Double.NEGATIVE_INFINITY && neitherInfiniteNorZeroNorNaN(imaginary)) { + return new Complex(0.0, Double.NaN); + } else if (real == Double.NEGATIVE_INFINITY && Double.isNaN(imaginary)) { + return new Complex(Double.NaN, Double.POSITIVE_INFINITY); + } else if (real == Double.POSITIVE_INFINITY && Double.isNaN(imaginary)) { + return new Complex(Double.POSITIVE_INFINITY, Double.NaN); } double t = Math.sqrt((Math.abs(real) + abs()) / 2.0); @@ -1102,11 +1110,12 @@ in the * @return the hyperbolic tangent of {@code this}. */ public Complex tanh() { - if (real > 20.0) { + if (real == Double.POSITIVE_INFINITY && imaginary == Double.POSITIVE_INFINITY) { return new Complex(1.0, 0.0); - } - if (real < -20.0) { - return new Complex(-1.0, 0.0); + } else if (real == Double.POSITIVE_INFINITY && Double.isNaN(imaginary)) { + return new Complex(1.0, 0.0); + } else if (Double.isNaN(real) && imaginary == 0) { + return new Complex(Double.NaN, 0); } double real2 = 2.0 * real; double imaginary2 = 2.0 * imaginary; http://git-wip-us.apache.org/repos/asf/commons-numbers/blob/a9437c90/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/CStandardTest.java ---------------------------------------------------------------------- diff --git a/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/CStandardTest.java b/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/CStandardTest.java index 1ca0106..6ec5460 100644 --- a/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/CStandardTest.java +++ b/commons-numbers-complex/src/test/java/org/apache/commons/numbers/complex/CStandardTest.java @@ -96,14 +96,14 @@ public class CStandardTest { @Test public void testImplicitTrig() { - Complex z1 = new Complex(3.0); + Complex z1 = new Complex(1.0); Complex z2 = new Complex(0.0, 3.0); assertComplex(z1.asin(), negI.multiply(z2.asinh())); assertComplex(z1.atan(), negI.multiply(z2.atanh()), Math.ulp(1), Math.ulp(1)); assertComplex(z1.cos(), z2.cosh()); assertComplex(z1.sin(), negI.multiply(z2.sinh())); // CURRENTLY FAILS BELOW TEST - // assertComplex(z1.tan(), negI.multiply(z1.tanh())); + assertComplex(z1.tan(), negI.multiply(z1.tanh())); } /**