Author: fanningpj
Date: Fri Feb  4 13:14:27 2022
New Revision: 1897764

URL: http://svn.apache.org/viewvc?rev=1897764&view=rev
Log:
add besselj function

Added:
    poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/BesselJ.java
      - copied, changed from r1897759, 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DollarDe.java
    
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestBesselJ.java
      - copied, changed from r1897759, 
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDollarFr.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=1897764&r1=1897763&r2=1897764&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 Feb  4 13:14:27 2022
@@ -72,7 +72,7 @@ public final class AnalysisToolPak imple
         r(m, "AVERAGEIFS", Averageifs.instance);
         r(m, "BAHTTEXT", null);
         r(m, "BESSELI", null);
-        r(m, "BESSELJ", null);
+        r(m, "BESSELJ", BesselJ.instance);
         r(m, "BESSELK", null);
         r(m, "BESSELY", null);
         r(m, "BIN2DEC", Bin2Dec.instance);

Copied: 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/BesselJ.java 
(from r1897759, 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DollarDe.java)
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/BesselJ.java?p2=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/BesselJ.java&p1=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DollarDe.java&r1=1897759&r2=1897764&rev=1897764&view=diff
==============================================================================
--- 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DollarDe.java 
(original)
+++ 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/BesselJ.java 
Fri Feb  4 13:14:27 2022
@@ -28,55 +28,33 @@ import java.math.BigDecimal;
 import java.math.MathContext;
 
 /**
- * Implementation for Excel DOLLARDE() function.
+ * Implementation for Excel BESSELJ() function.
  * <p>
- * 
https://support.microsoft.com/en-us/office/dollarde-function-db85aab0-1677-428a-9dfd-a38476693427
+ * 
https://support.microsoft.com/en-us/office/besselj-function-839cb181-48de-408b-9d80-bd02982d94f7
  */
-public final class DollarDe extends Fixed2ArgFunction implements 
FreeRefFunction {
+public final class BesselJ extends Fixed2ArgFunction implements 
FreeRefFunction {
 
-    public static final FreeRefFunction instance = new DollarDe();
+    public static final FreeRefFunction instance = new BesselJ();
 
     @Override
     public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval 
arg1, ValueEval arg2) {
         try {
-            Double number1 = evaluateValue(arg1, srcRowIndex, srcColumnIndex);
-            if (number1 == null) {
+            Double xval = evaluateValue(arg1, srcRowIndex, srcColumnIndex);
+            if (xval == null) {
                 return ErrorEval.VALUE_INVALID;
             }
-            Double number2 = evaluateValue(arg2, srcRowIndex, srcColumnIndex);
-            if (number2 == null) {
+            Double orderDouble = evaluateValue(arg2, srcRowIndex, 
srcColumnIndex);
+            if (orderDouble == null) {
                 return ErrorEval.VALUE_INVALID;
             }
-            int fraction = number2.intValue();
-            if (fraction < 0) {
+            int order = orderDouble.intValue();
+            if (order < 0) {
                 return ErrorEval.NUM_ERROR;
-            } else if (fraction == 0) {
-                return ErrorEval.DIV_ZERO;
             }
-            int fractionLength = String.valueOf(fraction).length();
 
-            boolean negative = false;
-            long valueLong = number1.longValue();
-            if (valueLong < 0) {
-                negative = true;
-                valueLong = -valueLong;
-                number1 = -number1;
-            }
-
-            double valueFractional = number1 - valueLong;
-            if (valueFractional == 0.0) {
-                return new NumberEval(valueLong);
-            }
-
-            BigDecimal inflated = 
BigDecimal.valueOf(valueFractional).multiply(BigDecimal.valueOf(Math.pow(10, 
fractionLength)));
-
-            BigDecimal calc = inflated.divide(BigDecimal.valueOf(fraction), 
MathContext.DECIMAL128);
-            BigDecimal result = calc.add(BigDecimal.valueOf(valueLong));
-            if (negative) {
-                result = result.multiply(BigDecimal.valueOf(-1));
-            }
+            org.apache.commons.math3.special.BesselJ bes = new 
org.apache.commons.math3.special.BesselJ(order);
 
-            return new NumberEval(result.doubleValue());
+            return new NumberEval(bes.value(xval));
         } catch (EvaluationException e) {
             return e.getErrorEval();
         }

Copied: 
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestBesselJ.java
 (from r1897759, 
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDollarFr.java)
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestBesselJ.java?p2=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestBesselJ.java&p1=poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDollarFr.java&r1=1897759&r2=1897764&rev=1897764&view=diff
==============================================================================
--- 
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDollarFr.java
 (original)
+++ 
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestBesselJ.java
 Fri Feb  4 13:14:27 2022
@@ -35,9 +35,9 @@ import static org.apache.poi.ss.util.Uti
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
- * Tests for {@link DollarFr}
+ * Tests for {@link BesselJ}
  */
-final class TestDollarFr {
+final class TestBesselJ {
 
     private static final OperationEvaluationContext ec = new 
OperationEvaluationContext(null, null, 0, 0, 0, null);
 
@@ -51,14 +51,7 @@ final class TestDollarFr {
         confirmNumError("22.5","-40");
     }
 
-    @Test
-    void testDiv0() {
-        confirmDiv0("22.5","0");
-        confirmDiv0("22.5","0.9");
-        confirmDiv0("22.5","-0.9");
-    }
-
-    
//https://support.microsoft.com/en-us/office/dollarfr-function-0835d163-3023-4a33-9824-3042c5d4f495
+    
//https://support.microsoft.com/en-us/office/besselj-function-839cb181-48de-408b-9d80-bd02982d94f7
     @Test
     void testMicrosoftExample1() throws IOException {
         try (HSSFWorkbook wb = new HSSFWorkbook()) {
@@ -66,17 +59,16 @@ final class TestDollarFr {
             HSSFRow row = sheet.createRow(0);
             HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
             HSSFCell cell = row.createCell(0);
-            double tolerance = 0.000000000000001;
-            assertDouble(fe, cell, "DOLLARFR(1.125,16)", 1.02, tolerance);
-            assertDouble(fe, cell, "DOLLARFR(-1.125,16)", -1.02, tolerance);
-            assertDouble(fe, cell, "DOLLARFR(1.000125,16)", 1.00002, 
tolerance);
-            assertDouble(fe, cell, "DOLLARFR(1.125,32)", 1.04, tolerance);
+            //this tolerance is too high but commons-math3 and excel don't 
match up as closely as we'd like
+            double tolerance = 0.000001;
+            assertDouble(fe, cell, "BESSELJ(1.9, 2)", 0.329925829, tolerance);
+            assertDouble(fe, cell, "BESSELJ(1.9, 2.5)", 0.329925829, 
tolerance);
         }
     }
 
     private static ValueEval invokeValue(String number1, String number2) {
         ValueEval[] args = new ValueEval[] { new StringEval(number1), new 
StringEval(number2) };
-        return DollarDe.instance.evaluate(args, ec);
+        return BesselJ.instance.evaluate(args, ec);
     }
 
     private static void confirmValue(String number1, String number2, double 
expected) {
@@ -97,10 +89,4 @@ final class TestDollarFr {
         assertEquals(ErrorEval.NUM_ERROR, result);
     }
 
-    private static void confirmDiv0(String number1, String number2) {
-        ValueEval result = invokeValue(number1, number2);
-        assertEquals(ErrorEval.class, result.getClass());
-        assertEquals(ErrorEval.DIV_ZERO, result);
-    }
-
 }



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

Reply via email to