summaryrefslogtreecommitdiff
path: root/calc.go
diff options
context:
space:
mode:
Diffstat (limited to 'calc.go')
-rw-r--r--calc.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/calc.go b/calc.go
index 9396fa2..3098e48 100644
--- a/calc.go
+++ b/calc.go
@@ -227,6 +227,8 @@ var tokenPriority = map[string]int{
// AVERAGE
// AVERAGEA
// BASE
+// BESSELI
+// BESSELJ
// BIN2DEC
// BIN2HEX
// BIN2OCT
@@ -1226,6 +1228,64 @@ func formulaCriteriaEval(val string, criteria *formulaCriteria) (result bool, er
// Engineering Functions
+// BESSELI function the modified Bessel function, which is equivalent to the
+// Bessel function evaluated for purely imaginary arguments. The syntax of
+// the Besseli function is:
+//
+// BESSELI(x,n)
+//
+func (fn *formulaFuncs) BESSELI(argsList *list.List) formulaArg {
+ if argsList.Len() != 2 {
+ return newErrorFormulaArg(formulaErrorVALUE, "BESSELI requires 2 numeric arguments")
+ }
+ return fn.bassel(argsList, true)
+}
+
+// BESSELJ function returns the Bessel function, Jn(x), for a specified order
+// and value of x. The syntax of the function is:
+//
+// BESSELJ(x,n)
+//
+func (fn *formulaFuncs) BESSELJ(argsList *list.List) formulaArg {
+ if argsList.Len() != 2 {
+ return newErrorFormulaArg(formulaErrorVALUE, "BESSELJ requires 2 numeric arguments")
+ }
+ return fn.bassel(argsList, false)
+}
+
+// bassel is an implementation of the formula function BESSELI and BESSELJ.
+func (fn *formulaFuncs) bassel(argsList *list.List, modfied bool) formulaArg {
+ x, n := argsList.Front().Value.(formulaArg).ToNumber(), argsList.Back().Value.(formulaArg).ToNumber()
+ if x.Type != ArgNumber {
+ return x
+ }
+ if n.Type != ArgNumber {
+ return n
+ }
+ max, x1 := 100, x.Number*0.5
+ x2 := x1 * x1
+ x1 = math.Pow(x1, n.Number)
+ n1, n2, n3, n4, add := fact(n.Number), 1.0, 0.0, n.Number, false
+ result := x1 / n1
+ t := result * 0.9
+ for result != t && max != 0 {
+ x1 *= x2
+ n3++
+ n1 *= n3
+ n4++
+ n2 *= n4
+ t = result
+ if modfied || add {
+ result += (x1 / n1 / n2)
+ } else {
+ result -= (x1 / n1 / n2)
+ }
+ max--
+ add = !add
+ }
+ return newNumberFormulaArg(result)
+}
+
// BIN2DEC function converts a Binary (a base-2 number) into a decimal number.
// The syntax of the function is:
//