summaryrefslogtreecommitdiff
path: root/calc.go
diff options
context:
space:
mode:
Diffstat (limited to 'calc.go')
-rw-r--r--calc.go77
1 files changed, 63 insertions, 14 deletions
diff --git a/calc.go b/calc.go
index f4f6b0c..657670c 100644
--- a/calc.go
+++ b/calc.go
@@ -572,8 +572,11 @@ type formulaFuncs struct {
// UNICODE
// UPPER
// VALUE
+// VAR
// VAR.P
+// VARA
// VARP
+// VARPA
// VLOOKUP
// WEEKDAY
// WEIBULL
@@ -6098,43 +6101,89 @@ func (fn *formulaFuncs) TRIMMEAN(argsList *list.List) formulaArg {
return fn.AVERAGE(args)
}
-// VARP function returns the Variance of a given set of values. The syntax of
-// the function is:
-//
-// VARP(number1,[number2],...)
-//
-func (fn *formulaFuncs) VARP(argsList *list.List) formulaArg {
+// vars is an implementation of the formula functions VAR, VARA, VARP, VAR.P
+// and VARPA.
+func (fn *formulaFuncs) vars(name string, argsList *list.List) formulaArg {
if argsList.Len() < 1 {
- return newErrorFormulaArg(formulaErrorVALUE, "VARP requires at least 1 argument")
+ return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires at least 1 argument", name))
}
summerA, summerB, count := 0.0, 0.0, 0.0
+ minimum := 0.0
+ if name == "VAR" || name == "VARA" {
+ minimum = 1.0
+ }
for arg := argsList.Front(); arg != nil; arg = arg.Next() {
for _, token := range arg.Value.(formulaArg).ToList() {
- if num := token.ToNumber(); num.Type == ArgNumber {
+ num := token.ToNumber()
+ if token.Value() != "TRUE" && num.Type == ArgNumber {
+ summerA += (num.Number * num.Number)
+ summerB += num.Number
+ count++
+ continue
+ }
+ num = token.ToBool()
+ if num.Type == ArgNumber {
summerA += (num.Number * num.Number)
summerB += num.Number
count++
+ continue
+ }
+ if name == "VARA" || name == "VARPA" {
+ count++
}
}
}
- if count > 0 {
+ if count > minimum {
summerA *= count
summerB *= summerB
- return newNumberFormulaArg((summerA - summerB) / (count * count))
+ return newNumberFormulaArg((summerA - summerB) / (count * (count - minimum)))
}
return newErrorFormulaArg(formulaErrorDIV, formulaErrorDIV)
}
+// VAR function returns the sample variance of a supplied set of values. The
+// syntax of the function is:
+//
+// VAR(number1,[number2],...)
+//
+func (fn *formulaFuncs) VAR(argsList *list.List) formulaArg {
+ return fn.vars("VAR", argsList)
+}
+
+// VARA function calculates the sample variance of a supplied set of values.
+// The syntax of the function is:
+//
+// VARA(number1,[number2],...)
+//
+func (fn *formulaFuncs) VARA(argsList *list.List) formulaArg {
+ return fn.vars("VARA", argsList)
+}
+
+// VARP function returns the Variance of a given set of values. The syntax of
+// the function is:
+//
+// VARP(number1,[number2],...)
+//
+func (fn *formulaFuncs) VARP(argsList *list.List) formulaArg {
+ return fn.vars("VARP", argsList)
+}
+
// VARdotP function returns the Variance of a given set of values. The syntax
// of the function is:
//
// VAR.P(number1,[number2],...)
//
func (fn *formulaFuncs) VARdotP(argsList *list.List) formulaArg {
- if argsList.Len() < 1 {
- return newErrorFormulaArg(formulaErrorVALUE, "VAR.P requires at least 1 argument")
- }
- return fn.VARP(argsList)
+ return fn.vars("VAR.P", argsList)
+}
+
+// VARPA function returns the Variance of a given set of values. The syntax of
+// the function is:
+//
+// VARPA(number1,[number2],...)
+//
+func (fn *formulaFuncs) VARPA(argsList *list.List) formulaArg {
+ return fn.vars("VARPA", argsList)
}
// WEIBULL function calculates the Weibull Probability Density Function or the