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));