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]

Reply via email to