diff --git a/samples/distro-examples/tests/all.bas b/samples/distro-examples/tests/all.bas index 198403db..cc656336 100644 --- a/samples/distro-examples/tests/all.bas +++ b/samples/distro-examples/tests/all.bas @@ -219,6 +219,7 @@ print "STATMEAN:" + STATMEAN (1,2,3,4,5,6,7,8,9) print "STATMEANDEV:" + STATMEANDEV (1,2,3,4,5,6,7,8,9) print "STATSPREADP:" + STATSPREADP (1,2,3,4,5,6,7,8,9) print "STATSPREADS:" + STATSPREADS (1,2,3,4,5,6,7,8,9) +print "STATSTD:" + STATSTD (1,2,3,4,5,6,7,8,9) print "STR:" + STR (5) print "STRING:"; STRING(5, "Strings") print "SUM:" + SUM (1,2,3,4,5,6,7,8,9) diff --git a/samples/distro-examples/tests/output/all.out b/samples/distro-examples/tests/output/all.out index 98556040..d4b49a47 100644 --- a/samples/distro-examples/tests/output/all.out +++ b/samples/distro-examples/tests/output/all.out @@ -202,6 +202,7 @@ STATMEAN:5 STATMEANDEV:2.22222222222222 STATSPREADP:6.66666666666667 STATSPREADS:7.5 +STATSTD:2.73861278752583 STR:5 STRING:StringsStringsStringsStringsStrings SUM:45 diff --git a/src/common/blib_func.c b/src/common/blib_func.c index 0689c629..3ff7b691 100644 --- a/src/common/blib_func.c +++ b/src/common/blib_func.c @@ -2600,6 +2600,7 @@ void cmd_genfunc(long funcCode, var_t *r) { // // case kwSTATMEANDEV: + case kwSTATSTD: case kwSTATSPREADS: case kwSTATSPREADP: ready = 0; @@ -2669,6 +2670,9 @@ void cmd_genfunc(long funcCode, var_t *r) { case kwSTATMEANDEV: r->v.n = statmeandev(dar, tcount); break; + case kwSTATSTD: + r->v.n = statstd(dar, tcount); + break; case kwSTATSPREADS: r->v.n = statspreads(dar, tcount); break; diff --git a/src/common/blib_math.c b/src/common/blib_math.c index 36293d4b..1c3d96c5 100644 --- a/src/common/blib_math.c +++ b/src/common/blib_math.c @@ -232,6 +232,31 @@ var_num_t statmeandev(var_num_t *e, int count) { return sum / count; } +// +// Standard deviation +// +var_num_t statstd(var_num_t *e, int count) { + var_num_t sum = 0.0; + var_num_t mean; + int i; + + if (count == 0) { + return 0; + } + + for (i = 0; i < count; i++) { + sum += e[i]; + } + mean = sum / count; + + sum = 0.0; + for (i = 0; i < count; i++) { + sum += pow(fabsl(e[i] - mean),2); + } + + return sqrt(sum / (count - 1)); +} + /* */ var_num_t statspreads(var_num_t *e, int count) { diff --git a/src/common/blib_math.h b/src/common/blib_math.h index 28076d5a..38ae21b5 100644 --- a/src/common/blib_math.h +++ b/src/common/blib_math.h @@ -66,19 +66,45 @@ var_num_t mat_determ(var_num_t *a, int n, double toler); /** * @ingroup math - * todo: statmeandev + * + * Mean absolute deviation around arithmetic mean + * + * @param e array with numbers + * @param count number of elements of e + * @return the mean absolute deviation around arithmetic mean */ var_num_t statmeandev(var_num_t *e, int count); /** * @ingroup math - * todo: statspreads + * + * Standard deviation + * + * @param e array with numbers + * @param count number of elements of e + * @return the standard deviation + */ +var_num_t statstd(var_num_t *e, int count); + +/** + * @ingroup math + * + * Unbiased sample variance + * + * @param e array with numbers + * @param count number of elements of e + * @return Unbiased sample variance */ var_num_t statspreads(var_num_t *e, int count); /** * @ingroup math - * todo: statspreadp + * + * Biased sample variance + * + * @param e array with numbers + * @param count number of elements of e + * @return Biased sample variance */ var_num_t statspreadp(var_num_t *e, int count); diff --git a/src/common/eval.c b/src/common/eval.c index a7b47e69..d48dcc92 100644 --- a/src/common/eval.c +++ b/src/common/eval.c @@ -1175,6 +1175,7 @@ static inline void eval_callf(var_t *r) { case kwSUMSV: case kwSTATMEAN: case kwSTATMEANDEV: + case kwSTATSTD: case kwSTATSPREADS: case kwSTATSPREADP: case kwSEGCOS: diff --git a/src/common/kw.h b/src/common/kw.h index 7af0dd8c..bb004e1c 100644 --- a/src/common/kw.h +++ b/src/common/kw.h @@ -348,6 +348,7 @@ enum func_keywords { kwSUM, kwSUMSV, kwSTATMEAN, + kwSTATSTD, kwSTATMEANDEV, kwSTATSPREADS, kwSTATSPREADP, diff --git a/src/languages/keywords.en.c b/src/languages/keywords.en.c index 9424f8c4..2f858c71 100644 --- a/src/languages/keywords.en.c +++ b/src/languages/keywords.en.c @@ -288,6 +288,7 @@ struct func_keyword_s func_table[] = { { "SUM", kwSUM }, { "SUMSQ", kwSUMSV }, { "STATMEAN", kwSTATMEAN }, +{ "STATSTD", kwSTATSTD}, { "STATMEANDEV", kwSTATMEANDEV }, { "STATSPREADS", kwSTATSPREADS }, { "STATSPREADP", kwSTATSPREADP },