Anonymous user
Averages/Simple moving average: Difference between revisions
→{{header|C}}: matches code in std deviation task.
(Mathematica) |
(→{{header|C}}: matches code in std deviation task.) |
||
Line 152:
=={{header|C}}==
The code in the first section duplicates the code for the Standard Deviation Task.
<lang c>#include <stdio.h>
#include <stdlib.h>
#include <
enum Action { STDDEV, MEAN, VAR, COUNT };
typedef struct stat_obj_struct {
double sum, sum2;
size_t num;
Action action;
} sStatObject, *StatObject;
StatObject NewStatObject( Action action )
{
so = (StatObject)malloc(sizeof(sStatObject));
so->sum = 0.0;
so->action = action;
return so;
}
#define FREE_STAT_OBJECT(so) \
free(so); so = NULL
double stat_obj_value(StatObject so, Action action)
{
double m;
if (so->num == 0.0) return 0.0;
switch(action) {
case
m = so->sum/so->num;
case MEAN:
return so->sum/so->num;
case VAR:
return so->sum2/so->num - m*m;
case COUNT:
return 1.0*so->num;
}
}
double stat_object_add(StatObject so, double v)
{
so->num++;
so->sum += v;
so->sum2 += v*v;
return stat_obj_value(so->action);
}</lang>
The following code creates the StatObject so that the add returns the running average.
<lang c>double v[] = { 1, 2, 3, 4, 5, 5, 4, 3, 2, 1 };
int main()
{
int i;
StatObject so = NewStatObject( MEAN );
for(i=0; i < sizeof(v)/sizeof(double) ; i++)
printf("val: %lf mean: %lf\n", v[i], stat_object_add(so, v[i]));
FREE_STAT_OBJECT(so);
return 0;
}</lang>
|