summaryrefslogtreecommitdiff
path: root/calc.go
diff options
context:
space:
mode:
authorxuri <xuri.me@gmail.com>2022-03-16 00:19:29 +0800
committerxuri <xuri.me@gmail.com>2022-03-16 00:19:29 +0800
commitc3424a9a0fc4f62b4884701e1430b420bbd8d0e4 (patch)
treedb78cb70a943b8f27faed9402f06a46b2b8ef1b6 /calc.go
parent4220bf4327a35a07ac6b47b652a120ed978a3a2a (diff)
ref #65, new formula functions: LOGNORM.DIST and LOGNORMDIST
Diffstat (limited to 'calc.go')
-rw-r--r--calc.go68
1 files changed, 68 insertions, 0 deletions
diff --git a/calc.go b/calc.go
index 951b843..9cadeb9 100644
--- a/calc.go
+++ b/calc.go
@@ -506,6 +506,8 @@ type formulaFuncs struct {
// LOG
// LOG10
// LOGINV
+// LOGNORM.DIST
+// LOGNORMDIST
// LOGNORM.INV
// LOOKUP
// LOWER
@@ -6473,6 +6475,72 @@ func (fn *formulaFuncs) LOGNORMdotINV(argsList *list.List) formulaArg {
return fn.LOGINV(argsList)
}
+// LOGNORMdotDIST function calculates the Log-Normal Probability Density
+// Function or the Cumulative Log-Normal Distribution Function for a supplied
+// value of x. The syntax of the function is:
+//
+// LOGNORM.DIST(x,mean,standard_dev,cumulative)
+//
+func (fn *formulaFuncs) LOGNORMdotDIST(argsList *list.List) formulaArg {
+ if argsList.Len() != 4 {
+ return newErrorFormulaArg(formulaErrorVALUE, "LOGNORM.DIST requires 4 arguments")
+ }
+ var x, mean, stdDev, cumulative formulaArg
+ if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
+ return x
+ }
+ if mean = argsList.Front().Next().Value.(formulaArg).ToNumber(); mean.Type != ArgNumber {
+ return mean
+ }
+ if stdDev = argsList.Back().Prev().Value.(formulaArg).ToNumber(); stdDev.Type != ArgNumber {
+ return stdDev
+ }
+ if cumulative = argsList.Back().Value.(formulaArg).ToBool(); cumulative.Type == ArgError {
+ return cumulative
+ }
+ if x.Number <= 0 || stdDev.Number <= 0 {
+ return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
+ }
+ if cumulative.Number == 1 {
+ args := list.New()
+ args.PushBack(newNumberFormulaArg((math.Log(x.Number) - mean.Number) / stdDev.Number))
+ args.PushBack(newNumberFormulaArg(0))
+ args.PushBack(newNumberFormulaArg(1))
+ args.PushBack(cumulative)
+ return fn.NORMDIST(args)
+ }
+ return newNumberFormulaArg((1 / (math.Sqrt(2*math.Pi) * stdDev.Number * x.Number)) *
+ math.Exp(0-(math.Pow((math.Log(x.Number)-mean.Number), 2)/(2*math.Pow(stdDev.Number, 2)))))
+
+}
+
+// LOGNORMDIST function calculates the Cumulative Log-Normal Distribution
+// Function at a supplied value of x. The syntax of the function is:
+//
+// LOGNORMDIST(x,mean,standard_dev)
+//
+func (fn *formulaFuncs) LOGNORMDIST(argsList *list.List) formulaArg {
+ if argsList.Len() != 3 {
+ return newErrorFormulaArg(formulaErrorVALUE, "LOGNORMDIST requires 3 arguments")
+ }
+ var x, mean, stdDev formulaArg
+ if x = argsList.Front().Value.(formulaArg).ToNumber(); x.Type != ArgNumber {
+ return x
+ }
+ if mean = argsList.Front().Next().Value.(formulaArg).ToNumber(); mean.Type != ArgNumber {
+ return mean
+ }
+ if stdDev = argsList.Back().Value.(formulaArg).ToNumber(); stdDev.Type != ArgNumber {
+ return stdDev
+ }
+ if x.Number <= 0 || stdDev.Number <= 0 {
+ return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
+ }
+ args := list.New()
+ args.PushBack(newNumberFormulaArg((math.Log(x.Number) - mean.Number) / stdDev.Number))
+ return fn.NORMSDIST(args)
+}
+
// NORMdotDIST function calculates the Normal Probability Density Function or
// the Cumulative Normal Distribution. Function for a supplied set of
// parameters. The syntax of the function is: