Cumulative standard deviation: Difference between revisions

From Rosetta Code
Content added Content deleted
m (make it clearer that the testing data is just that: testing data)
(c)
Line 3: Line 3:


Use this to compute the standard deviation of the demonstration set: <math>2, 4, 4, 4, 5, 5, 7, 9</math>
Use this to compute the standard deviation of the demonstration set: <math>2, 4, 4, 4, 5, 5, 7, 9</math>

=={{header|C}}==

Of course this function is not thread-safe nor it can be used to compute the standard deviation just for a set of values per time.

<lang c>#include <stdio.h>
#include <stdlib.h>
#include <math.h>

enum Action { VALUE, STDDEV, MEAN, VAR, COUNT, RESET };
double stat_object(double v, enum Action action)
{
static double sum = 0.0;
static double sum2 = 0.0;
static size_t num = 0;

double m;

switch(action) {
case VALUE:
num++;
sum += v;
sum2 += v*v;
return stat_object(0.0, STDDEV);
case STDDEV:
return sqrt(stat_object(0.0, VAR));
case MEAN:
return (num>0) ? sum/(double)num : 0.0;
case VAR:
m = stat_object(0.0, MEAN);
return (num>0) ? (sum2/(double)num - m*m) : 0.0;
case COUNT:
return num;
case RESET:
sum = sum2 = 0.0; num = 0;
return 0.0;
}
}</lang>

<lang c>double v[] = { 2,4,4,4,5,5,7,9 };

int main()
{
int i;
double sd;

for(i=0; i < sizeof(v)/sizeof(double) ; i++)
sd = stat_object(v[i], VALUE);

printf("standard dev = %lf\n", sd);

return 0;
}</lang>


=={{header|Tcl}}==
=={{header|Tcl}}==

Revision as of 14:58, 16 June 2009

Task
Cumulative standard deviation
You are encouraged to solve this task according to the task description, using any language you may know.

Write a stateful function, class, generator or coroutine that takes a series of floating point numbers, one at a time, and returns the running standard deviation of the series. The task implementation should use the most natural programming style of those listed for the function in the implementation language; the task must state which is being used. Do not apply Bessel's Correction; the returned standard deviation should always be computed as if the sample seen so far is the entire population.

Use this to compute the standard deviation of the demonstration set:

C

Of course this function is not thread-safe nor it can be used to compute the standard deviation just for a set of values per time.

<lang c>#include <stdio.h>

  1. include <stdlib.h>
  2. include <math.h>

enum Action { VALUE, STDDEV, MEAN, VAR, COUNT, RESET }; double stat_object(double v, enum Action action) {

 static double sum = 0.0;
 static double sum2 = 0.0;
 static size_t num = 0;
 double m;
 switch(action) {
 case VALUE:
   num++;
   sum += v;
   sum2 += v*v;
   return stat_object(0.0, STDDEV);
 case STDDEV:
   return sqrt(stat_object(0.0, VAR));
 case MEAN:
   return (num>0) ? sum/(double)num : 0.0;
 case VAR:
   m = stat_object(0.0, MEAN);
   return (num>0) ? (sum2/(double)num - m*m) : 0.0;
 case COUNT:
   return num;
 case RESET:
   sum = sum2 = 0.0; num = 0;
   return 0.0;
 }

}</lang>

<lang c>double v[] = { 2,4,4,4,5,5,7,9 };

int main() {

 int i;
 double sd;
 for(i=0; i < sizeof(v)/sizeof(double) ; i++)
   sd = stat_object(v[i], VALUE);
 printf("standard dev = %lf\n", sd);
 return 0;

}</lang>

Tcl

With a Class

Works with: Tcl version 8.6

<lang tcl>oo::class create SDAccum {

   variable sum sum2 num
   constructor {} {
       set sum 0.0
       set sum2 0.0
       set num 0
   }
   method value {x} {
       set sum2 [expr {$sum2 + $x**2}]
       set sum [expr {$sum + $x}]
       incr num
       return [my stddev]
   }
   method count {} {
       return $num
   }
   method mean {} {
       expr {$sum / double($num)}
   }
   method variance {} {
       expr {($sum2 - double($num)*[my mean]**2)/double($num)}
   }
   method stddev {} {
       expr {sqrt([my variance])}
   }

}

  1. Demonstration

set sdacc [SDAccum new] foreach val {2 4 4 4 5 5 7 9} {

   set sd [$sdacc value $val]

} puts "the standard deviation is: $sd"</lang> which produces the output:

the standard deviation is: 2.0