summaryrefslogtreecommitdiff
path: root/calc.go
diff options
context:
space:
mode:
Diffstat (limited to 'calc.go')
-rw-r--r--calc.go49
1 files changed, 49 insertions, 0 deletions
diff --git a/calc.go b/calc.go
index e64d260..951b843 100644
--- a/calc.go
+++ b/calc.go
@@ -505,6 +505,8 @@ type formulaFuncs struct {
// LN
// LOG
// LOG10
+// LOGINV
+// LOGNORM.INV
// LOOKUP
// LOWER
// MATCH
@@ -6424,6 +6426,53 @@ func (fn *formulaFuncs) FINV(argsList *list.List) formulaArg {
return newNumberFormulaArg((1/calcBetainv(1-(1-probability.Number), d2.Number/2, d1.Number/2, 0, 1) - 1) * (d2.Number / d1.Number))
}
+// LOGINV function calculates the inverse of the Cumulative Log-Normal
+// Distribution Function of x, for a supplied probability. The syntax of the
+// function is:
+//
+// LOGINV(probability,mean,standard_dev)
+//
+func (fn *formulaFuncs) LOGINV(argsList *list.List) formulaArg {
+ if argsList.Len() != 3 {
+ return newErrorFormulaArg(formulaErrorVALUE, "LOGINV requires 3 arguments")
+ }
+ var probability, mean, stdDev formulaArg
+ if probability = argsList.Front().Value.(formulaArg).ToNumber(); probability.Type != ArgNumber {
+ return probability
+ }
+ 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 probability.Number <= 0 || probability.Number >= 1 {
+ return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
+ }
+ if stdDev.Number <= 0 {
+ return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
+ }
+ args := list.New()
+ args.PushBack(probability)
+ args.PushBack(newNumberFormulaArg(0))
+ args.PushBack(newNumberFormulaArg(1))
+ norminv := fn.NORMINV(args)
+ return newNumberFormulaArg(math.Exp(mean.Number + stdDev.Number*norminv.Number))
+}
+
+// LOGNORMdotINV function calculates the inverse of the Cumulative Log-Normal
+// Distribution Function of x, for a supplied probability. The syntax of the
+// function is:
+//
+// LOGNORM.INV(probability,mean,standard_dev)
+//
+func (fn *formulaFuncs) LOGNORMdotINV(argsList *list.List) formulaArg {
+ if argsList.Len() != 3 {
+ return newErrorFormulaArg(formulaErrorVALUE, "LOGNORM.INV requires 3 arguments")
+ }
+ return fn.LOGINV(argsList)
+}
+
// 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: