Skip to content

Commit eefca91

Browse files
authored
Merge pull request #171 from Joe7M/master
Add new SB function STATSTD (standard deviation)
2 parents 518f10a + feca7f2 commit eefca91

File tree

8 files changed

+63
-3
lines changed

8 files changed

+63
-3
lines changed

samples/distro-examples/tests/all.bas

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ print "STATMEAN:" + STATMEAN (1,2,3,4,5,6,7,8,9)
219219
print "STATMEANDEV:" + STATMEANDEV (1,2,3,4,5,6,7,8,9)
220220
print "STATSPREADP:" + STATSPREADP (1,2,3,4,5,6,7,8,9)
221221
print "STATSPREADS:" + STATSPREADS (1,2,3,4,5,6,7,8,9)
222+
print "STATSTD:" + STATSTD (1,2,3,4,5,6,7,8,9)
222223
print "STR:" + STR (5)
223224
print "STRING:"; STRING(5, "Strings")
224225
print "SUM:" + SUM (1,2,3,4,5,6,7,8,9)

samples/distro-examples/tests/output/all.out

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ STATMEAN:5
202202
STATMEANDEV:2.22222222222222
203203
STATSPREADP:6.66666666666667
204204
STATSPREADS:7.5
205+
STATSTD:2.73861278752583
205206
STR:5
206207
STRING:StringsStringsStringsStringsStrings
207208
SUM:45

src/common/blib_func.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2600,6 +2600,7 @@ void cmd_genfunc(long funcCode, var_t *r) {
26002600
//
26012601
//
26022602
case kwSTATMEANDEV:
2603+
case kwSTATSTD:
26032604
case kwSTATSPREADS:
26042605
case kwSTATSPREADP:
26052606
ready = 0;
@@ -2669,6 +2670,9 @@ void cmd_genfunc(long funcCode, var_t *r) {
26692670
case kwSTATMEANDEV:
26702671
r->v.n = statmeandev(dar, tcount);
26712672
break;
2673+
case kwSTATSTD:
2674+
r->v.n = statstd(dar, tcount);
2675+
break;
26722676
case kwSTATSPREADS:
26732677
r->v.n = statspreads(dar, tcount);
26742678
break;

src/common/blib_math.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,31 @@ var_num_t statmeandev(var_num_t *e, int count) {
232232
return sum / count;
233233
}
234234

235+
//
236+
// Standard deviation
237+
//
238+
var_num_t statstd(var_num_t *e, int count) {
239+
var_num_t sum = 0.0;
240+
var_num_t mean;
241+
int i;
242+
243+
if (count == 0) {
244+
return 0;
245+
}
246+
247+
for (i = 0; i < count; i++) {
248+
sum += e[i];
249+
}
250+
mean = sum / count;
251+
252+
sum = 0.0;
253+
for (i = 0; i < count; i++) {
254+
sum += pow(fabsl(e[i] - mean),2);
255+
}
256+
257+
return sqrt(sum / (count - 1));
258+
}
259+
235260
/*
236261
*/
237262
var_num_t statspreads(var_num_t *e, int count) {

src/common/blib_math.h

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,19 +66,45 @@ var_num_t mat_determ(var_num_t *a, int n, double toler);
6666

6767
/**
6868
* @ingroup math
69-
* todo: statmeandev
69+
*
70+
* Mean absolute deviation around arithmetic mean
71+
*
72+
* @param e array with numbers
73+
* @param count number of elements of e
74+
* @return the mean absolute deviation around arithmetic mean
7075
*/
7176
var_num_t statmeandev(var_num_t *e, int count);
7277

7378
/**
7479
* @ingroup math
75-
* todo: statspreads
80+
*
81+
* Standard deviation
82+
*
83+
* @param e array with numbers
84+
* @param count number of elements of e
85+
* @return the standard deviation
86+
*/
87+
var_num_t statstd(var_num_t *e, int count);
88+
89+
/**
90+
* @ingroup math
91+
*
92+
* Unbiased sample variance
93+
*
94+
* @param e array with numbers
95+
* @param count number of elements of e
96+
* @return Unbiased sample variance
7697
*/
7798
var_num_t statspreads(var_num_t *e, int count);
7899

79100
/**
80101
* @ingroup math
81-
* todo: statspreadp
102+
*
103+
* Biased sample variance
104+
*
105+
* @param e array with numbers
106+
* @param count number of elements of e
107+
* @return Biased sample variance
82108
*/
83109
var_num_t statspreadp(var_num_t *e, int count);
84110

src/common/eval.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,6 +1175,7 @@ static inline void eval_callf(var_t *r) {
11751175
case kwSUMSV:
11761176
case kwSTATMEAN:
11771177
case kwSTATMEANDEV:
1178+
case kwSTATSTD:
11781179
case kwSTATSPREADS:
11791180
case kwSTATSPREADP:
11801181
case kwSEGCOS:

src/common/kw.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ enum func_keywords {
348348
kwSUM,
349349
kwSUMSV,
350350
kwSTATMEAN,
351+
kwSTATSTD,
351352
kwSTATMEANDEV,
352353
kwSTATSPREADS,
353354
kwSTATSPREADP,

src/languages/keywords.en.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ struct func_keyword_s func_table[] = {
288288
{ "SUM", kwSUM },
289289
{ "SUMSQ", kwSUMSV },
290290
{ "STATMEAN", kwSTATMEAN },
291+
{ "STATSTD", kwSTATSTD},
291292
{ "STATMEANDEV", kwSTATMEANDEV },
292293
{ "STATSPREADS", kwSTATSPREADS },
293294
{ "STATSPREADP", kwSTATSPREADP },

0 commit comments

Comments
 (0)