From e1abdb0e5a0ecae47dd0116c9165f4ad6e492856 Mon Sep 17 00:00:00 2001 From: xuri Date: Thu, 25 Mar 2021 00:05:02 +0800 Subject: This closes #809, and add new fn: HARMEAN --- calc.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'calc.go') diff --git a/calc.go b/calc.go index 8be52c7..04d0f8b 100644 --- a/calc.go +++ b/calc.go @@ -282,6 +282,7 @@ var tokenPriority = map[string]int{ // GAMMA // GAMMALN // GCD +// HARMEAN // HEX2BIN // HEX2DEC // HEX2OCT @@ -3927,6 +3928,40 @@ func (fn *formulaFuncs) GAMMALN(argsList *list.List) formulaArg { return newErrorFormulaArg(formulaErrorVALUE, "GAMMALN requires 1 numeric argument") } +// HARMEAN function calculates the harmonic mean of a supplied set of values. +// The syntax of the function is: +// +// HARMEAN(number1,[number2],...) +// +func (fn *formulaFuncs) HARMEAN(argsList *list.List) formulaArg { + if argsList.Len() < 1 { + return newErrorFormulaArg(formulaErrorVALUE, "HARMEAN requires at least 1 argument") + } + if min := fn.MIN(argsList); min.Number < 0 { + return newErrorFormulaArg(formulaErrorNA, formulaErrorNA) + } + number, val, cnt := 0.0, 0.0, 0.0 + for token := argsList.Front(); token != nil; token = token.Next() { + arg := token.Value.(formulaArg) + switch arg.Type { + case ArgString: + num := arg.ToNumber() + if num.Type != ArgNumber { + continue + } + number = num.Number + case ArgNumber: + number = arg.Number + } + if number <= 0 { + return newErrorFormulaArg(formulaErrorNA, formulaErrorNA) + } + val += (1 / number) + cnt++ + } + return newNumberFormulaArg(1 / (val / cnt)) +} + // KURT function calculates the kurtosis of a supplied set of values. The // syntax of the function is: // -- cgit v1.2.1