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