Author: fanningpj
Date: Fri Apr 29 23:19:53 2022
New Revision: 1900410
URL: http://svn.apache.org/viewvc?rev=1900410&view=rev
Log:
support lcm function
Added:
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Lcm.java
- copied, changed from r1900409,
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Gcd.java
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestLcm.java
- copied, changed from r1900408,
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestGcd.java
Modified:
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
Modified:
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java?rev=1900410&r1=1900409&r2=1900410&view=diff
==============================================================================
---
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
(original)
+++
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
Fri Apr 29 23:19:53 2022
@@ -141,7 +141,7 @@ public final class AnalysisToolPak imple
r(m, "ISEVEN", ParityFunction.IS_EVEN);
r(m, "ISODD", ParityFunction.IS_ODD);
r(m, "JIS", null);
- r(m, "LCM", null);
+ r(m, "LCM", Lcm.instance);
r(m, "MAXIFS", Maxifs.instance);
r(m, "MDURATION", null);
r(m, "MINIFS", Minifs.instance);
Copied:
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Lcm.java (from
r1900409,
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Gcd.java)
URL:
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Lcm.java?p2=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Lcm.java&p1=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Gcd.java&r1=1900409&r2=1900410&rev=1900410&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Gcd.java
(original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Lcm.java
Fri Apr 29 23:19:53 2022
@@ -28,22 +28,22 @@ import java.util.ArrayList;
/**
- * Implementation for Excel GCD() function.
+ * Implementation for Excel LCM() function.
* <p>
- * <b>Syntax</b>:<br> <b>GCD </b>(<b>number</b>, ...)<br>
+ * <b>Syntax</b>:<br> <b>LCM </b>(<b>number</b>, ...)<br>
* </p>
* <p>
- * Returns the greatest common divisor of two or more integers. The greatest
common divisor is the largest integer that divides both number1 and number2
without a remainder.
+ * Returns the least common multiple of integers. The least common multiple
is the smallest positive integer that is a multiple of all integer arguments
number1, number2, and so on. Use LCM to add fractions with different
denominators.
* </p>
* <p>
- * See
https://support.microsoft.com/en-us/office/gcd-function-d5107a51-69e3-461f-8e4c-ddfc21b5073a
+ * See
https://support.microsoft.com/en-us/office/lcm-function-7152b67a-8bb5-4075-ae5c-06ede5563c94
* </p>
*/
-public class Gcd implements FreeRefFunction {
+public class Lcm implements FreeRefFunction {
- public static final Gcd instance = new Gcd();
+ public static final Lcm instance = new Lcm();
- private static final long MAX_INPUT = (long)Math.pow(2, 53);
+ private static final long MAX_OUTPUT = (long)Math.pow(2, 53);
@Override
public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec)
{
@@ -73,7 +73,10 @@ public class Gcd implements FreeRefFunct
}
long result = evals.get(0);
for (int i = 1; i < evals.size(); i++) {
- result = ArithmeticUtils.gcd(result, evals.get(i));
+ result = ArithmeticUtils.lcm(result, evals.get(i));
+ if (result > MAX_OUTPUT) {
+ return ErrorEval.NUM_ERROR;
+ }
}
return new NumberEval(result);
} catch (EvaluationException ee) {
@@ -83,6 +86,6 @@ public class Gcd implements FreeRefFunct
}
private boolean isInvalidInput(double d) {
- return (d < 0 || d > MAX_INPUT);
+ return d < 0;
}
}
Copied:
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestLcm.java
(from r1900408,
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestGcd.java)
URL:
http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestLcm.java?p2=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestLcm.java&p1=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestGcd.java&r1=1900408&r2=1900410&rev=1900410&view=diff
==============================================================================
---
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestGcd.java
(original)
+++
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestLcm.java
Fri Apr 29 23:19:53 2022
@@ -17,44 +17,32 @@
package org.apache.poi.ss.formula.functions;
-import org.apache.poi.hssf.usermodel.HSSFCell;
-import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
-import org.apache.poi.hssf.usermodel.HSSFSheet;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.OperationEvaluationContext;
-import org.apache.poi.ss.formula.eval.BoolEval;
import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.formula.eval.NumberEval;
import org.apache.poi.ss.formula.eval.StringEval;
import org.apache.poi.ss.formula.eval.ValueEval;
import org.junit.jupiter.api.Test;
-import java.io.IOException;
import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
-import static org.apache.poi.ss.util.Utils.addRow;
-import static org.apache.poi.ss.util.Utils.assertDouble;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
- * Tests for {@link Gcd}
+ * Tests for {@link Lcm}
*/
-final class TestGcd {
+final class TestLcm {
private static final OperationEvaluationContext ec = new
OperationEvaluationContext(null, null, 0, 0, 0, null);
-
//https://support.microsoft.com/en-us/office/gcd-function-d5107a51-69e3-461f-8e4c-ddfc21b5073a
+
//https://support.microsoft.com/en-us/office/lcm-function-7152b67a-8bb5-4075-ae5c-06ede5563c94
@Test
void testBasic() {
- confirmValue(Arrays.asList(5, 2), 1.0);
- confirmValue(Arrays.asList(24, 36), 12.0);
- confirmValue(Arrays.asList(7, 1), 1.0);
- confirmValue(Arrays.asList(5, 0), 5.0);
- confirmValue(Arrays.asList(10, 5, 0), 5.0);
- confirmValue(Arrays.asList(10.9, 5, 0), 5.0);
- confirmValue(Arrays.asList(Math.pow(2, 53), 2.0), 2.0);
+ confirmValue(Arrays.asList(5, 2), 10.0);
+ confirmValue(Arrays.asList(24, 36), 72.0);
+ confirmValue(Arrays.asList(24, 36, 144), 144.0);
+ confirmValue(Arrays.asList(24, 36, 144.9), 144.0);
}
@Test
@@ -81,7 +69,7 @@ final class TestGcd {
args[i++] = new StringEval(obj.toString());
}
}
- return Gcd.instance.evaluate(args, ec);
+ return Lcm.instance.evaluate(args, ec);
}
private static void confirmValue(List<Object> numberList, double expected)
{
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]