summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--calc.go65
-rw-r--r--calc_test.go22
2 files changed, 85 insertions, 2 deletions
diff --git a/calc.go b/calc.go
index 381f11c..a161dda 100644
--- a/calc.go
+++ b/calc.go
@@ -343,6 +343,8 @@ type formulaFuncs struct {
// COMPLEX
// CONCAT
// CONCATENATE
+// CONFIDENCE
+// CONFIDENCE.NORM
// COS
// COSH
// COT
@@ -4945,6 +4947,65 @@ func (fn *formulaFuncs) CHIDIST(argsList *list.List) formulaArg {
return newNumberFormulaArg(1 - (incompleteGamma(degress.Number/2, x.Number/2) / math.Gamma(degress.Number/2)))
}
+// confidence is an implementation of the formula function CONFIDENCE and
+// CONFIDENCE.NORM.
+func (fn *formulaFuncs) confidence(name string, argsList *list.List) formulaArg {
+ if argsList.Len() != 3 {
+ return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 3 numeric arguments", name))
+ }
+ alpha := argsList.Front().Value.(formulaArg).ToNumber()
+ if alpha.Type != ArgNumber {
+ return alpha
+ }
+ if alpha.Number <= 0 || alpha.Number >= 1 {
+ return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
+ }
+ stdDev := argsList.Front().Next().Value.(formulaArg).ToNumber()
+ if stdDev.Type != ArgNumber {
+ return stdDev
+ }
+ if stdDev.Number <= 0 {
+ return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
+ }
+ size := argsList.Back().Value.(formulaArg).ToNumber()
+ if size.Type != ArgNumber {
+ return size
+ }
+ if size.Number < 1 {
+ return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
+ }
+ args := list.New()
+ args.Init()
+ args.PushBack(newNumberFormulaArg(alpha.Number / 2))
+ args.PushBack(newNumberFormulaArg(0))
+ args.PushBack(newNumberFormulaArg(1))
+ return newNumberFormulaArg(-fn.NORMINV(args).Number * (stdDev.Number / math.Sqrt(size.Number)))
+}
+
+// CONFIDENCE function uses a Normal Distribution to calculate a confidence
+// value that can be used to construct the Confidence Interval for a
+// population mean, for a supplied probablity and sample size. It is assumed
+// that the standard deviation of the population is known. The syntax of the
+// function is:
+//
+// CONFIDENCE(alpha,standard_dev,size)
+//
+func (fn *formulaFuncs) CONFIDENCE(argsList *list.List) formulaArg {
+ return fn.confidence("CONFIDENCE", argsList)
+}
+
+// CONFIDENCEdotNORM function uses a Normal Distribution to calculate a
+// confidence value that can be used to construct the confidence interval for
+// a population mean, for a supplied probablity and sample size. It is
+// assumed that the standard deviation of the population is known. The syntax
+// of the Confidence.Norm function is:
+//
+// CONFIDENCE.NORM(alpha,standard_dev,size)
+//
+func (fn *formulaFuncs) CONFIDENCEdotNORM(argsList *list.List) formulaArg {
+ return fn.confidence("CONFIDENCE.NORM", argsList)
+}
+
// calcStringCountSum is part of the implementation countSum.
func calcStringCountSum(countText bool, count, sum float64, num, arg formulaArg) (float64, float64) {
if countText && num.Type == ArgError && arg.String != "" {
@@ -5517,7 +5578,7 @@ func norminv(p float64) (float64, error) {
return 0, errors.New(formulaErrorNUM)
}
-// kth is an implementation of the formula function LARGE and SMALL.
+// kth is an implementation of the formula functions LARGE and SMALL.
func (fn *formulaFuncs) kth(name string, argsList *list.List) formulaArg {
if argsList.Len() != 2 {
return newErrorFormulaArg(formulaErrorVALUE, fmt.Sprintf("%s requires 2 arguments", name))
@@ -11146,7 +11207,7 @@ func (fn *formulaFuncs) TBILLYIELD(argsList *list.List) formulaArg {
return newNumberFormulaArg(((100 - pr.Number) / pr.Number) * (360 / dsm))
}
-// prepareVdbArgs checking and prepare arguments for the formula functions
+// prepareVdbArgs checking and prepare arguments for the formula function
// VDB.
func (fn *formulaFuncs) prepareVdbArgs(argsList *list.List) formulaArg {
cost := argsList.Front().Value.(formulaArg).ToNumber()
diff --git a/calc_test.go b/calc_test.go
index c9896c7..880c40a 100644
--- a/calc_test.go
+++ b/calc_test.go
@@ -777,6 +777,10 @@ func TestCalcCellValue(t *testing.T) {
// CHIDIST
"=CHIDIST(0.5,3)": "0.918891411654676",
"=CHIDIST(8,3)": "0.0460117056892315",
+ // CONFIDENCE
+ "=CONFIDENCE(0.05,0.07,100)": "0.0137197479028414",
+ // CONFIDENCE.NORM
+ "=CONFIDENCE.NORM(0.05,0.07,100)": "0.0137197479028414",
// COUNT
"=COUNT()": "0",
"=COUNT(E1:F2,\"text\",1,INT(2))": "3",
@@ -2133,6 +2137,24 @@ func TestCalcCellValue(t *testing.T) {
"=CHIDIST()": "CHIDIST requires 2 numeric arguments",
"=CHIDIST(\"\",3)": "strconv.ParseFloat: parsing \"\": invalid syntax",
"=CHIDIST(0.5,\"\")": "strconv.ParseFloat: parsing \"\": invalid syntax",
+ // CONFIDENCE
+ "=CONFIDENCE()": "CONFIDENCE requires 3 numeric arguments",
+ "=CONFIDENCE(\"\",0.07,100)": "strconv.ParseFloat: parsing \"\": invalid syntax",
+ "=CONFIDENCE(0.05,\"\",100)": "strconv.ParseFloat: parsing \"\": invalid syntax",
+ "=CONFIDENCE(0.05,0.07,\"\")": "strconv.ParseFloat: parsing \"\": invalid syntax",
+ "=CONFIDENCE(0,0.07,100)": "#NUM!",
+ "=CONFIDENCE(1,0.07,100)": "#NUM!",
+ "=CONFIDENCE(0.05,0,100)": "#NUM!",
+ "=CONFIDENCE(0.05,0.07,0.5)": "#NUM!",
+ // CONFIDENCE.NORM
+ "=CONFIDENCE.NORM()": "CONFIDENCE.NORM requires 3 numeric arguments",
+ "=CONFIDENCE.NORM(\"\",0.07,100)": "strconv.ParseFloat: parsing \"\": invalid syntax",
+ "=CONFIDENCE.NORM(0.05,\"\",100)": "strconv.ParseFloat: parsing \"\": invalid syntax",
+ "=CONFIDENCE.NORM(0.05,0.07,\"\")": "strconv.ParseFloat: parsing \"\": invalid syntax",
+ "=CONFIDENCE.NORM(0,0.07,100)": "#NUM!",
+ "=CONFIDENCE.NORM(1,0.07,100)": "#NUM!",
+ "=CONFIDENCE.NORM(0.05,0,100)": "#NUM!",
+ "=CONFIDENCE.NORM(0.05,0.07,0.5)": "#NUM!",
// COUNTBLANK
"=COUNTBLANK()": "COUNTBLANK requires 1 argument",
"=COUNTBLANK(1,2)": "COUNTBLANK requires 1 argument",