Author: fanningpj
Date: Fri Apr 29 22:44:57 2022
New Revision: 1900408

URL: http://svn.apache.org/viewvc?rev=1900408&view=rev
Log:
support gcd function

Modified:
    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/TestGcd.java

Modified: 
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/Gcd.java?rev=1900408&r1=1900407&r2=1900408&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/Gcd.java 
Fri Apr 29 22:44:57 2022
@@ -30,6 +30,8 @@ public class Gcd implements FreeRefFunct
 
     public static final Gcd instance = new Gcd();
 
+    private static final long MAX_INPUT = (long)Math.pow(2, 53);
+
     @Override
     public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) 
{
         if (args.length < 1) {
@@ -37,11 +39,11 @@ public class Gcd implements FreeRefFunct
         } else if (args.length == 1) {
             try {
                 ValueEval v1 = OperandResolver.getSingleValue(args[0], 
ec.getRowIndex(), ec.getColumnIndex());
-                long l = (long)OperandResolver.coerceValueToDouble(v1);
-                if (l < 0) {
+                double d = OperandResolver.coerceValueToDouble(v1);
+                if (isInvalidInput(d)) {
                     return ErrorEval.NUM_ERROR;
                 }
-                return new NumberEval(l);
+                return new NumberEval((long)d);
             } catch (EvaluationException ee) {
                 return ErrorEval.VALUE_INVALID;
             }
@@ -50,11 +52,11 @@ public class Gcd implements FreeRefFunct
                 ArrayList<Long> evals = new ArrayList<>();
                 for (int i = 0; i < args.length; i++) {
                     ValueEval ve = OperandResolver.getSingleValue(args[i], 
ec.getRowIndex(), ec.getColumnIndex());
-                    long l = (long)OperandResolver.coerceValueToDouble(ve);
-                    if (l < 0) {
+                    double d = OperandResolver.coerceValueToDouble(ve);
+                    if (isInvalidInput(d)) {
                         return ErrorEval.NUM_ERROR;
                     }
-                    evals.add(l);
+                    evals.add((long)d);
                 }
                 long result = evals.get(0);
                 for (int i = 1; i < evals.size(); i++) {
@@ -66,4 +68,8 @@ public class Gcd implements FreeRefFunct
             }
         }
     }
+
+    private boolean isInvalidInput(double d) {
+        return (d < 0 || d > MAX_INPUT);
+    }
 }

Modified: 
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/TestGcd.java?rev=1900408&r1=1900407&r2=1900408&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/TestGcd.java 
Fri Apr 29 22:44:57 2022
@@ -54,12 +54,14 @@ final class TestGcd {
         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);
     }
 
     @Test
     void testNumError() {
         confirmNumError(Arrays.asList(-1));
         confirmNumError(Arrays.asList(10, -1));
+        confirmNumError(Arrays.asList(Math.pow(2, 54), 2.0));
     }
 
     @Test



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to