You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oe...@apache.org on 2015/11/05 21:26:20 UTC

[4/4] [math] MATH-1269: fixed FastMath.exp returning NaN for non-NaN arguments

MATH-1269: fixed FastMath.exp returning NaN for non-NaN arguments

Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/8aecb842
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/8aecb842
Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/8aecb842

Branch: refs/heads/MATH_3_X
Commit: 8aecb842d32464a98eaab722da84902f8126957b
Parents: 69c8368
Author: Otmar Ertl <ot...@gmail.com>
Authored: Thu Nov 5 21:19:35 2015 +0100
Committer: Otmar Ertl <ot...@gmail.com>
Committed: Thu Nov 5 21:19:35 2015 +0100

----------------------------------------------------------------------
 src/changes/changes.xml                                     | 3 +++
 src/main/java/org/apache/commons/math3/util/FastMath.java   | 7 +++++++
 .../java/org/apache/commons/math3/util/FastMathTest.java    | 9 +++++++++
 3 files changed, 19 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-math/blob/8aecb842/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 4a7a846..5bdaf76 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -51,6 +51,9 @@ If the output is not quite correct, check for invisible trailing spaces!
   </properties>
   <body>
     <release version="3.6" date="XXXX-XX-XX" description="">
+      <action dev="oertl" type="fix" issue="MATH-1269">
+        Fixed FastMath.exp that potentially returned NaN for non-NaN argument.
+      </action>
       <action dev="luc" type="add">
         Added a nth order Brent solver for general real fields, replacing the former
         solver that was restricted to Dfp fields only.

http://git-wip-us.apache.org/repos/asf/commons-math/blob/8aecb842/src/main/java/org/apache/commons/math3/util/FastMath.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math3/util/FastMath.java b/src/main/java/org/apache/commons/math3/util/FastMath.java
index 161ad6c..f30b502 100644
--- a/src/main/java/org/apache/commons/math3/util/FastMath.java
+++ b/src/main/java/org/apache/commons/math3/util/FastMath.java
@@ -968,6 +968,13 @@ public class FastMath {
        much larger than the others.  If there are extra bits specified from the
        pow() function, use them. */
         final double tempC = tempB + tempA;
+
+        // If tempC is positive infinite, the evaluation below could result in NaN,
+        // because z could be negative at the same time.
+        if (tempC == Double.POSITIVE_INFINITY) {
+            return Double.POSITIVE_INFINITY;
+        }
+
         final double result;
         if (extra != 0.0) {
             result = tempC*extra*z + tempC*extra + tempC*z + tempB + tempA;

http://git-wip-us.apache.org/repos/asf/commons-math/blob/8aecb842/src/test/java/org/apache/commons/math3/util/FastMathTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/math3/util/FastMathTest.java b/src/test/java/org/apache/commons/math3/util/FastMathTest.java
index aadc4ec..2df5542 100644
--- a/src/test/java/org/apache/commons/math3/util/FastMathTest.java
+++ b/src/test/java/org/apache/commons/math3/util/FastMathTest.java
@@ -215,6 +215,15 @@ public class FastMathTest {
         }
         Assert.assertEquals(0, maxErr, 3);
     }
+    
+    @Test
+    public void testMath1269() {
+        final double arg = 709.8125;
+        final double vM = Math.exp(arg);
+        final double vFM = FastMath.exp(arg);
+        Assert.assertTrue("exp(" + arg + ") is " + vFM + " instead of " + vM,
+                          Precision.equalsIncludingNaN(vM, vFM));
+    }
 
     @Test
     public void testHyperbolicInverses() {