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/09 11:58:55 UTC

[commons-numbers] 01/02: sqrt() handling of zero extends to all real numbers (imaginary == 0)

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 69499d3ab2b66185c5f0bbb8a850d2c4fc540d85
Author: aherbert <ah...@apache.org>
AuthorDate: Mon Dec 9 11:54:25 2019 +0000

    sqrt() handling of zero extends to all real numbers (imaginary == 0)
---
 .../main/java/org/apache/commons/numbers/complex/Complex.java  | 10 +++++++---
 1 file changed, 7 insertions(+), 3 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 4a4ee76..b4f1e8b 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
@@ -1714,9 +1714,13 @@ public final class Complex implements Serializable  {
         }
         if (Double.isFinite(real)) {
             if (Double.isFinite(imaginary)) {
-                // Handle zero
-                if (real == 0 && imaginary == 0) {
-                    return new Complex(0, imaginary);
+                // Edge case for real numbers
+                if (imaginary == 0) {
+                    final double sqrtAbs = Math.sqrt(Math.abs(real));
+                    if (real < 0) {
+                        return new Complex(0, Math.copySign(sqrtAbs, imaginary));
+                    }
+                    return new Complex(sqrtAbs, Math.copySign(0, imaginary));
                 }
                 final double abs = getAbsolute(real, imaginary);
                 final double av = (Math.abs(real) + abs) / 2;