diff --git a/src/java/org/apache/poi/ss/formula/functions/Irr.java b/src/java/org/apache/poi/ss/formula/functions/Irr.java index a2faf181c..1384793ff 100644 --- a/src/java/org/apache/poi/ss/formula/functions/Irr.java +++ b/src/java/org/apache/poi/ss/formula/functions/Irr.java @@ -24,9 +24,6 @@ import org.apache.poi.ss.formula.eval.*; * * Syntax is IRR(values) or IRR(values,guess) * - * @author Marcel May - * @author Yegor Kozlov - * * @see Wikipedia on IRR * @see Excel IRR */ @@ -89,8 +86,8 @@ public final class Irr implements Function { * http://en.wikipedia.org/wiki/Newton%27s_method */ public static double irr(double[] values, double guess) { - int maxIterationCount = 20; - double absoluteAccuracy = 1E-7; + final int maxIterationCount = 20; + final double absoluteAccuracy = 1E-7; double x0 = guess; double x1; @@ -99,11 +96,15 @@ public final class Irr implements Function { while (i < maxIterationCount) { // the value of the function (NPV) and its derivate can be calculated in the same loop - double fValue = 0; + final double factor = 1.0 + x0; + int k = 0; + double fValue = values[k]; double fDerivative = 0; - for (int k = 0; k < values.length; k++) { - fValue += values[k] / Math.pow(1.0 + x0, k); - fDerivative += -k * values[k] / Math.pow(1.0 + x0, k + 1); + for (double denominator = factor; ++k < values.length; ) { + final double value = values[k]; + fValue += value / denominator; + denominator *= factor; + fDerivative -= k * value / denominator; } // the essense of the Newton-Raphson Method