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]