summaryrefslogtreecommitdiff
path: root/calc.go
diff options
context:
space:
mode:
authorxuri <xuri.me@gmail.com>2021-09-14 22:23:12 +0800
committerxuri <xuri.me@gmail.com>2021-09-14 22:23:12 +0800
commit1ba3690764e90aa6f7bcb3cb1e095475d40e3d91 (patch)
tree4bfa3d8946ba11c16d7cd8103cd2eb3da8f91c77 /calc.go
parent4ef68729f5bf2150b06cbace068412b3dde2d1ae (diff)
new formula functions: WEIBULL and WEIBULL.DIST, ref #65
Diffstat (limited to 'calc.go')
-rw-r--r--calc.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/calc.go b/calc.go
index fa6ec0a..9cbc8ec 100644
--- a/calc.go
+++ b/calc.go
@@ -504,6 +504,8 @@ type formulaFuncs struct {
// VAR.P
// VARP
// VLOOKUP
+// WEIBULL
+// WEIBULL.DIST
// XOR
// YEAR
// Z.TEST
@@ -5614,6 +5616,46 @@ func (fn *formulaFuncs) VARdotP(argsList *list.List) formulaArg {
return fn.VARP(argsList)
}
+// WEIBULL function calculates the Weibull Probability Density Function or the
+// Weibull Cumulative Distribution Function for a supplied set of parameters.
+// The syntax of the function is:
+//
+// WEIBULL(x,alpha,beta,cumulative)
+//
+func (fn *formulaFuncs) WEIBULL(argsList *list.List) formulaArg {
+ if argsList.Len() != 4 {
+ return newErrorFormulaArg(formulaErrorVALUE, "WEIBULL requires 4 arguments")
+ }
+ x := argsList.Front().Value.(formulaArg).ToNumber()
+ alpha := argsList.Front().Next().Value.(formulaArg).ToNumber()
+ beta := argsList.Back().Prev().Value.(formulaArg).ToNumber()
+ if alpha.Type == ArgNumber && beta.Type == ArgNumber && x.Type == ArgNumber {
+ if alpha.Number < 0 || alpha.Number <= 0 || beta.Number <= 0 {
+ return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
+ }
+ cumulative := argsList.Back().Value.(formulaArg).ToBool()
+ if cumulative.Boolean && cumulative.Number == 1 {
+ return newNumberFormulaArg(1 - math.Exp(0-math.Pow((x.Number/beta.Number), alpha.Number)))
+ }
+ return newNumberFormulaArg((alpha.Number / math.Pow(beta.Number, alpha.Number)) *
+ math.Pow(x.Number, (alpha.Number-1)) * math.Exp(0-math.Pow((x.Number/beta.Number), alpha.Number)))
+ }
+ return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
+}
+
+// WEIBULLdotDIST function calculates the Weibull Probability Density Function
+// or the Weibull Cumulative Distribution Function for a supplied set of
+// parameters. The syntax of the function is:
+//
+// WEIBULL.DIST(x,alpha,beta,cumulative)
+//
+func (fn *formulaFuncs) WEIBULLdotDIST(argsList *list.List) formulaArg {
+ if argsList.Len() != 4 {
+ return newErrorFormulaArg(formulaErrorVALUE, "WEIBULL.DIST requires 4 arguments")
+ }
+ return fn.WEIBULL(argsList)
+}
+
// ZdotTEST function calculates the one-tailed probability value of the
// Z-Test. The syntax of the function is:
//