Fix DerivativeStructure.pow for 0 argument and power less than 1.

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

Branch: refs/heads/develop
Commit: 540564e190662e6617d8c8974854ded6ff2b365a
Parents: c64856f
Author: Luc Maisonobe <[email protected]>
Authored: Fri Aug 5 15:05:33 2016 +0200
Committer: Emmanuel Bourg <[email protected]>
Committed: Fri Aug 5 15:05:33 2016 +0200

----------------------------------------------------------------------
 .../math4/analysis/differentiation/DSCompiler.java      |  6 ++++++
 .../differentiation/DerivativeStructureTest.java        | 12 ++++++++++++
 2 files changed, 18 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-math/blob/540564e1/src/main/java/org/apache/commons/math4/analysis/differentiation/DSCompiler.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/commons/math4/analysis/differentiation/DSCompiler.java
 
b/src/main/java/org/apache/commons/math4/analysis/differentiation/DSCompiler.java
index 7d5c163..8e07838 100644
--- 
a/src/main/java/org/apache/commons/math4/analysis/differentiation/DSCompiler.java
+++ 
b/src/main/java/org/apache/commons/math4/analysis/differentiation/DSCompiler.java
@@ -893,6 +893,12 @@ public class DSCompiler {
             return;
         }
 
+        if (operand[operandOffset] == 0) {
+            // special case, 0^p = 0 for all p
+            Arrays.fill(result, resultOffset, resultOffset + getSize(), 0);
+            return;
+        }
+
         // create the function value and derivatives
         // [x^p, px^(p-1), p(p-1)x^(p-2), ... ]
         double[] function = new double[1 + order];

http://git-wip-us.apache.org/repos/asf/commons-math/blob/540564e1/src/test/java/org/apache/commons/math4/analysis/differentiation/DerivativeStructureTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/math4/analysis/differentiation/DerivativeStructureTest.java
 
b/src/test/java/org/apache/commons/math4/analysis/differentiation/DerivativeStructureTest.java
index 8d0c733..1bb7718 100644
--- 
a/src/test/java/org/apache/commons/math4/analysis/differentiation/DerivativeStructureTest.java
+++ 
b/src/test/java/org/apache/commons/math4/analysis/differentiation/DerivativeStructureTest.java
@@ -345,6 +345,18 @@ public class DerivativeStructureTest extends 
ExtendedFieldElementAbstractTest<De
                     Assert.assertEquals(0.0, d, Precision.SAFE_MIN);
                 }
             }
+
+            // 0^p with p smaller than 1.0
+            DerivativeStructure u = new DerivativeStructure(3, maxOrder, 1, 
-0.0).pow(0.25);
+            for (int i0 = 0; i0 <= maxOrder; ++i0) {
+                for (int i1 = 0; i1 <= maxOrder; ++i1) {
+                    for (int i2 = 0; i2 <= maxOrder; ++i2) {
+                        if (i0 + i1 + i2 <= maxOrder) {
+                            Assert.assertEquals(0.0, 
u.getPartialDerivative(i0, i1, i2), 1.0e-10);
+                        }
+                    }
+                }
+            }
         }
 
     }

Reply via email to