Author: onealj
Date: Tue May 16 03:18:17 2017
New Revision: 1795266
URL: http://svn.apache.org/viewvc?rev=1795266&view=rev
Log:
github-32: speed up Irr() Excel formula computation by replacing Math.pow()
with multiplication. Thanks to Daniel Kuan! This closes #32.
https://github.com/apache/poi/pull/32
Modified:
poi/trunk/src/java/org/apache/poi/ss/formula/functions/Irr.java
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/functions/Irr.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/functions/Irr.java?rev=1795266&r1=1795265&r2=1795266&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/functions/Irr.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/functions/Irr.java Tue May 16
03:18:17 2017
@@ -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 <a
href="http://en.wikipedia.org/wiki/Internal_rate_of_return#Numerical_solution">Wikipedia
on IRR</a>
* @see <a
href="http://office.microsoft.com/en-us/excel-help/irr-HP005209146.aspx">Excel
IRR</a>
*/
@@ -89,8 +86,8 @@ public final class Irr implements Functi
* http://en.wikipedia.org/wiki/Newton%27s_method</a>
*/
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 Functi
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
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]