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() {