You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2013/08/27 13:15:18 UTC
svn commit: r1517788 - in /commons/proper/math/trunk/src:
main/java/org/apache/commons/math3/analysis/differentiation/DSCompiler.java
test/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructureTest.java
Author: luc
Date: Tue Aug 27 11:15:18 2013
New Revision: 1517788
URL: http://svn.apache.org/r1517788
Log:
Improved handling of negative arguments for power function.
Thanks to Ajo Fod.
Modified:
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/differentiation/DSCompiler.java
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructureTest.java
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/differentiation/DSCompiler.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/differentiation/DSCompiler.java?rev=1517788&r1=1517787&r2=1517788&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/differentiation/DSCompiler.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/analysis/differentiation/DSCompiler.java Tue Aug 27 11:15:18 2013
@@ -860,6 +860,8 @@ public class DSCompiler {
infinity = -infinity;
function[i] = infinity;
}
+ } else if (operand[operandOffset] < 0) {
+ Arrays.fill(function, Double.NaN);
}
} else {
function[0] = FastMath.pow(a, operand[operandOffset]);
Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructureTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructureTest.java?rev=1517788&r1=1517787&r2=1517788&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructureTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/analysis/differentiation/DerivativeStructureTest.java Tue Aug 27 11:15:18 2013
@@ -239,6 +239,24 @@ public class DerivativeStructureTest ext
}
+ // negative base: -1^x can be evaluated for integers only, so value is sometimes OK, derivatives are always NaN
+ DerivativeStructure negEvenInteger = DerivativeStructure.pow(-2.0, new DerivativeStructure(3, maxOrder, 0, 2.0));
+ Assert.assertEquals(4.0, negEvenInteger.getValue(), 1.0e-15);
+ Assert.assertTrue(Double.isNaN(negEvenInteger.getPartialDerivative(1, 0, 0)));
+ DerivativeStructure negOddInteger = DerivativeStructure.pow(-2.0, new DerivativeStructure(3, maxOrder, 0, 3.0));
+ Assert.assertEquals(-8.0, negOddInteger.getValue(), 1.0e-15);
+ Assert.assertTrue(Double.isNaN(negOddInteger.getPartialDerivative(1, 0, 0)));
+ DerivativeStructure negNonInteger = DerivativeStructure.pow(-2.0, new DerivativeStructure(3, maxOrder, 0, 2.001));
+ Assert.assertTrue(Double.isNaN(negNonInteger.getValue()));
+ Assert.assertTrue(Double.isNaN(negNonInteger.getPartialDerivative(1, 0, 0)));
+
+ DerivativeStructure zeroNeg = DerivativeStructure.pow(0.0, new DerivativeStructure(3, maxOrder, 0, -1.0));
+ Assert.assertTrue(Double.isNaN(zeroNeg.getValue()));
+ Assert.assertTrue(Double.isNaN(zeroNeg.getPartialDerivative(1, 0, 0)));
+ DerivativeStructure posNeg = DerivativeStructure.pow(2.0, new DerivativeStructure(3, maxOrder, 0, -2.0));
+ Assert.assertEquals(1.0 / 4.0, posNeg.getValue(), 1.0e-15);
+ Assert.assertEquals(FastMath.log(2.0) / 4.0, posNeg.getPartialDerivative(1, 0, 0), 1.0e-15);
+
// very special case: a = 0 and power = 0
DerivativeStructure zeroZero = DerivativeStructure.pow(0.0, new DerivativeStructure(3, maxOrder, 0, 0.0));