Author: fanningpj
Date: Sat Apr 30 08:16:48 2022
New Revision: 1900416

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

Added:
    poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Sqrtpi.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/TestSqrtpi.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=1900416&r1=1900415&r2=1900416&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 
Sat Apr 30 08:16:48 2022
@@ -172,7 +172,7 @@ public final class AnalysisToolPak imple
         r(m, "RTD", null);
         r(m, "SERIESSUM", null);
         r(m, "SINGLE", Single.instance);
-        r(m, "SQRTPI", null);
+        r(m, "SQRTPI", Sqrtpi.instance);
         r(m, "SUMIFS", Sumifs.instance);
         r(m, "SWITCH", Switch.instance);
         r(m, "TBILLEQ", null);

Copied: 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Sqrtpi.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/Sqrtpi.java?p2=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Sqrtpi.java&p1=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/Gcd.java&r1=1900409&r2=1900416&rev=1900416&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/Sqrtpi.java 
Sat Apr 30 08:16:48 2022
@@ -16,73 +16,53 @@
 ==================================================================== */
 package org.apache.poi.ss.formula.functions;
 
-import org.apache.commons.math3.util.ArithmeticUtils;
 import org.apache.poi.ss.formula.OperationEvaluationContext;
 import org.apache.poi.ss.formula.eval.ErrorEval;
 import org.apache.poi.ss.formula.eval.EvaluationException;
 import org.apache.poi.ss.formula.eval.NumberEval;
 import org.apache.poi.ss.formula.eval.OperandResolver;
 import org.apache.poi.ss.formula.eval.ValueEval;
-
-import java.util.ArrayList;
-
+import org.apache.poi.ss.util.NumberToTextConverter;
 
 /**
- * Implementation for Excel GCD() function.
+ * Implementation for Excel SQRTPI() function.
  * <p>
- *   <b>Syntax</b>:<br> <b>GCD  </b>(<b>number</b>, ...)<br>
+ *   <b>Syntax</b>:<br> <b>SQRT  </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 square root of (number * pi).
  * </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/sqrtpi-function-1fb4e63f-9b51-46d6-ad68-b3e7a8b519b4
  * </p>
  */
-public class Gcd implements FreeRefFunction {
+public class Sqrtpi implements FreeRefFunction {
 
-    public static final Gcd instance = new Gcd();
-
-    private static final long MAX_INPUT = (long)Math.pow(2, 53);
+    public static final Sqrtpi instance = new Sqrtpi();
 
     @Override
-    public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) 
{
-        if (args.length < 1) {
+    public ValueEval evaluate(final ValueEval[] args, final 
OperationEvaluationContext ec) {
+        if (args.length != 1) {
             return ErrorEval.VALUE_INVALID;
-        } else if (args.length == 1) {
-            try {
-                ValueEval v1 = OperandResolver.getSingleValue(args[0], 
ec.getRowIndex(), ec.getColumnIndex());
-                double d = OperandResolver.coerceValueToDouble(v1);
-                if (isInvalidInput(d)) {
-                    return ErrorEval.NUM_ERROR;
-                }
-                return new NumberEval((long)d);
-            } catch (EvaluationException ee) {
-                return ErrorEval.VALUE_INVALID;
-            }
-        } else {
-            try {
-                ArrayList<Long> evals = new ArrayList<>();
-                for (int i = 0; i < args.length; i++) {
-                    ValueEval ve = OperandResolver.getSingleValue(args[i], 
ec.getRowIndex(), ec.getColumnIndex());
-                    double d = OperandResolver.coerceValueToDouble(ve);
-                    if (isInvalidInput(d)) {
-                        return ErrorEval.NUM_ERROR;
-                    }
-                    evals.add((long)d);
-                }
-                long result = evals.get(0);
-                for (int i = 1; i < evals.size(); i++) {
-                    result = ArithmeticUtils.gcd(result, evals.get(i));
-                }
-                return new NumberEval(result);
-            } catch (EvaluationException ee) {
-                return ErrorEval.VALUE_INVALID;
+        }
+        return evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0]);
+    }
+
+    private ValueEval evaluate(final int srcRowIndex, final int 
srcColumnIndex, final ValueEval arg0) {
+        try {
+            final ValueEval v1 = OperandResolver.getSingleValue(arg0, 
srcRowIndex, srcColumnIndex);
+            final double d = OperandResolver.coerceValueToDouble(v1);
+            if (isInvalidInput(d)) {
+                return ErrorEval.NUM_ERROR;
             }
+            final double result = Math.sqrt(Math.PI * d);
+            return new 
NumberEval(Double.parseDouble(NumberToTextConverter.toText(result)));
+        } catch (EvaluationException e) {
+            return e.getErrorEval();
         }
     }
 
     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/TestSqrtpi.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/TestSqrtpi.java?p2=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestSqrtpi.java&p1=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestGcd.java&r1=1900408&r2=1900416&rev=1900416&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/TestSqrtpi.java 
Sat Apr 30 08:16:48 2022
@@ -17,51 +17,35 @@
 
 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 Sqrtpi}
  */
-final class TestGcd {
+final class TestSqrtpi {
 
     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/sqrtpi-function-1fb4e63f-9b51-46d6-ad68-b3e7a8b519b4
     @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(1), 1.77245385090552);
+        confirmValue(Arrays.asList(2), 2.506628274631);
     }
 
     @Test
     void testNumError() {
         confirmNumError(Arrays.asList(-1));
-        confirmNumError(Arrays.asList(10, -1));
-        confirmNumError(Arrays.asList(Math.pow(2, 54), 2.0));
     }
 
     @Test
@@ -81,7 +65,7 @@ final class TestGcd {
                 args[i++] = new StringEval(obj.toString());
             }
         }
-        return Gcd.instance.evaluate(args, ec);
+        return Sqrtpi.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