summaryrefslogtreecommitdiff
path: root/calc.go
diff options
context:
space:
mode:
Diffstat (limited to 'calc.go')
-rw-r--r--calc.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/calc.go b/calc.go
index 9ba6626..eac0f6c 100644
--- a/calc.go
+++ b/calc.go
@@ -373,6 +373,10 @@ type formulaFuncs struct {
// DOLLARFR
// EFFECT
// ENCODEURL
+// ERF
+// ERF.PRECISE
+// ERFC
+// ERFC.PRECISE
// EVEN
// EXACT
// EXP
@@ -2003,6 +2007,80 @@ func (fn *formulaFuncs) DELTA(argsList *list.List) formulaArg {
return newBoolFormulaArg(number1.Number == number2.Number).ToNumber()
}
+// ERF function calculates the Error Function, integrated between two supplied
+// limits. The syntax of the function is:
+//
+// ERF(lower_limit,[upper_limit])
+//
+func (fn *formulaFuncs) ERF(argsList *list.List) formulaArg {
+ if argsList.Len() < 1 {
+ return newErrorFormulaArg(formulaErrorVALUE, "ERF requires at least 1 argument")
+ }
+ if argsList.Len() > 2 {
+ return newErrorFormulaArg(formulaErrorVALUE, "ERF allows at most 2 arguments")
+ }
+ lower := argsList.Front().Value.(formulaArg).ToNumber()
+ if lower.Type != ArgNumber {
+ return lower
+ }
+ if argsList.Len() == 2 {
+ upper := argsList.Back().Value.(formulaArg).ToNumber()
+ if upper.Type != ArgNumber {
+ return upper
+ }
+ return newNumberFormulaArg(math.Erf(upper.Number) - math.Erf(lower.Number))
+ }
+ return newNumberFormulaArg(math.Erf(lower.Number))
+}
+
+// ERFdotPRECISE function calculates the Error Function, integrated between a
+// supplied lower or upper limit and 0. The syntax of the function is:
+//
+// ERF.PRECISE(x)
+//
+func (fn *formulaFuncs) ERFdotPRECISE(argsList *list.List) formulaArg {
+ if argsList.Len() != 1 {
+ return newErrorFormulaArg(formulaErrorVALUE, "ERF.PRECISE requires 1 argument")
+ }
+ x := argsList.Front().Value.(formulaArg).ToNumber()
+ if x.Type != ArgNumber {
+ return x
+ }
+ return newNumberFormulaArg(math.Erf(x.Number))
+}
+
+// erfc is an implementation of the formula functions ERFC and ERFC.PRECISE.
+func (fn *formulaFuncs) erfc(name string, argsList *list.List) formulaArg {
+ if argsList.Len() != 1 {
+ return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 1 argument", name))
+ }
+ x := argsList.Front().Value.(formulaArg).ToNumber()
+ if x.Type != ArgNumber {
+ return x
+ }
+ return newNumberFormulaArg(math.Erfc(x.Number))
+}
+
+// ERFC function calculates the Complementary Error Function, integrated
+// between a supplied lower limit and infinity. The syntax of the function
+// is:
+//
+// ERFC(x)
+//
+func (fn *formulaFuncs) ERFC(argsList *list.List) formulaArg {
+ return fn.erfc("ERFC", argsList)
+}
+
+// ERFC.PRECISE function calculates the Complementary Error Function,
+// integrated between a supplied lower limit and infinity. The syntax of the
+// function is:
+//
+// ERFC(x)
+//
+func (fn *formulaFuncs) ERFCdotPRECISE(argsList *list.List) formulaArg {
+ return fn.erfc("ERFC.PRECISE", argsList)
+}
+
// GESTEP unction tests whether a supplied number is greater than a supplied
// step size and returns. The syntax of the function is:
//