diff --git a/hipparchus-core/src/changes/changes.xml b/hipparchus-core/src/changes/changes.xml index ef51cb8aa..29f84f585 100644 --- a/hipparchus-core/src/changes/changes.xml +++ b/hipparchus-core/src/changes/changes.xml @@ -50,6 +50,9 @@ If the output is not quite correct, check for invisible trailing spaces! + + Fixed {Field}Complex.atan for real values. + Added getAddendum() to CalculusFieldElement interface. diff --git a/hipparchus-core/src/main/java/org/hipparchus/complex/Complex.java b/hipparchus-core/src/main/java/org/hipparchus/complex/Complex.java index 6eedb1283..23038ab9d 100644 --- a/hipparchus-core/src/main/java/org/hipparchus/complex/Complex.java +++ b/hipparchus-core/src/main/java/org/hipparchus/complex/Complex.java @@ -802,6 +802,9 @@ public Complex atan() { final Complex tmp = createComplex((1 + imaginary) / (1 - imaginary), 0.0).log().multiplyPlusI().multiply(0.5); return createComplex(FastMath.copySign(tmp.real, real), tmp.imaginary); + } else if (imaginary == 0.0) { + // taking care to preserve the sign of the zero imaginary part + return createComplex(FastMath.atan(real), imaginary); } else { // regular formula final Complex n = createComplex(1 + imaginary, -real); diff --git a/hipparchus-core/src/main/java/org/hipparchus/complex/FieldComplex.java b/hipparchus-core/src/main/java/org/hipparchus/complex/FieldComplex.java index 247888f9e..efeada4c1 100644 --- a/hipparchus-core/src/main/java/org/hipparchus/complex/FieldComplex.java +++ b/hipparchus-core/src/main/java/org/hipparchus/complex/FieldComplex.java @@ -910,6 +910,9 @@ public FieldComplex atan() { log().multiplyPlusI().multiply(0.5); return createComplex(FastMath.copySign(tmp.real, real), tmp.imaginary); + } else if (imaginary.isZero()) { + // taking care to preserve the sign of the zero imaginary part + return createComplex(FastMath.atan(real), imaginary); } else { // regular formula final FieldComplex n = createComplex(one.add(imaginary), real.negate()); diff --git a/hipparchus-core/src/test/java/org/hipparchus/complex/ComplexTest.java b/hipparchus-core/src/test/java/org/hipparchus/complex/ComplexTest.java index 02e71514a..69b43bcfd 100644 --- a/hipparchus-core/src/test/java/org/hipparchus/complex/ComplexTest.java +++ b/hipparchus-core/src/test/java/org/hipparchus/complex/ComplexTest.java @@ -31,6 +31,7 @@ import org.hipparchus.util.FastMath; import org.hipparchus.util.MathUtils; import org.hipparchus.util.Precision; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.util.Arrays; @@ -860,6 +861,18 @@ void testAtanBranchCuts() { assertTrue(FastMath.copySign(1.0, FastMath.atan(new Complex(-0.0, -0.25)).getReal()) < 0.0); } + @Test + public void testAtanReal() { + final Complex zP = new Complex(0.8734729023516287, 0.0); + final Complex aP = new Complex(0.717964439926383, 0.0); + Assertions.assertEquals(aP, zP.atan()); + Assertions.assertEquals(1.0, FastMath.copySign(1.0, zP.atan().getImaginary()), 1.0e-15); + final Complex zM = new Complex(0.8734729023516287, -0.0); + final Complex aM = new Complex(0.717964439926383, -0.0); + Assertions.assertEquals(aM, zM.atan()); + Assertions.assertEquals(-1.0, FastMath.copySign(1.0, zM.atan().getImaginary()), 1.0e-15); + } + @Test @Override public void testAtan2() { diff --git a/hipparchus-core/src/test/java/org/hipparchus/complex/FieldComplexTest.java b/hipparchus-core/src/test/java/org/hipparchus/complex/FieldComplexTest.java index 40ede04e2..e23753c2d 100644 --- a/hipparchus-core/src/test/java/org/hipparchus/complex/FieldComplexTest.java +++ b/hipparchus-core/src/test/java/org/hipparchus/complex/FieldComplexTest.java @@ -27,6 +27,7 @@ import org.hipparchus.util.MathArrays; import org.hipparchus.util.MathUtils; import org.hipparchus.util.Precision; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.util.Arrays; @@ -915,6 +916,18 @@ void testAtanBranchCuts() { assertTrue(FastMath.copySign(1.0, FastMath.atan(build(-0.0, -0.25)).getReal()) < 0.0); } + @Test + public void testAtanReal() { + final FieldComplex zP = build(0.8734729023516287, 0.0); + final FieldComplex aP = build(0.717964439926383, 0.0); + Assertions.assertEquals(aP, zP.atan()); + Assertions.assertEquals(1.0, FastMath.copySign(new Binary64(1.0), zP.atan().getImaginary()).getReal(), 1.0e-15); + final FieldComplex zM = build(0.8734729023516287, -0.0); + final FieldComplex aM = build(0.717964439926383, -0.0); + Assertions.assertEquals(aM, zM.atan()); + Assertions.assertEquals(-1.0, FastMath.copySign(new Binary64(1.0), zM.atan().getImaginary()).getReal(), 1.0e-15); + } + @Test @Override public void testAtan2() {