stats - Simple
Statistics Tool
for analyzing average, sum,
standard deviation, variance,
number of observations and max/min of large quantities of
data
#include <stdio.h>
#include
<stdlib.h>
#include
<getopt.h>
#include
<math.h>
/*
Simple
Statistics Tool for Large Quantities of Data
Christian
Doerr; http://www-plan.cs.colorado.edu
*/
void
help()
{
printf("Simple
Statistics Tools\n");
printf("from
http://www-plan.cs.colorado.edu\n\n");
printf("Options
(short form):\n");
printf("
no options display number of observations, mean and
standard deviation\n");
printf("
--avg (-a) \t\t average\n");
printf("
--sum (-s) \t\t sum\n");
printf("
--std (-d) \t\t standard deviation\n");
printf("
--var (-v) \t\t variance\n");
printf("
--num (-i) \t\t number of
observations\n");
printf("
--min (-n) \t\t minimum value\n");
printf("
--max (-x) \t\t maximum value\n");
printf("
--help (-h) \t\t this short help\n");
}
int
main(int
argc,
char **argv)
{
static
struct option
long_options[] =
{
{"avg",
no_argument,
0,
'a'},
{"sum",
no_argument,
0,
's'},
{"std",
no_argument,
0,
'd'},
{"var",
no_argument,
0,
'v'},
{"num",
no_argument,
0,
'i'},
{"min",
no_argument,
0,
'n'},
{"max",
no_argument,
0,
'x'},
{"help",
no_argument,
0,
'h'},
{0,
0,
0,
0}
};
int
option_index
=
0;
float
sum=0,
sumsquare=0;
float
min
=
0, max
=
0;
int
num=0;
float
val=0;
int
c =
getopt_long (argc, argv,
"asdvinxh",
long_options, &option_index);
if(c=='h')
{ help(); exit(0);
}
while(scanf("%f\n",
&val) != EOF)
{
if(num==0)
{ min = val; max = val; }
else
if(min
> val) min = val;
else
if(max
< val) max = val;
sum+=val;
sumsquare+=val*val;
num++;
/*
Cuts
down O(n) to O(1) space by using
(\sum_{i}
(x_i - x_{bar})^2) / n =
(\sum_{i} {x_i}^2 - ((\sum_{i} x_i)^2) / n) / n - 1
*/
}
float
mean =
sum/num;
float
var =
(sumsquare - (sum*sum / num))/(num-1);
float
std =
sqrt(var);
switch(c)
{
case
'a':
printf("%f\n",
mean);
break;
case
'd':
printf("%f\n",
std);
break;
case
's':
printf("%f\n",
sum);
break;
case
'v':
printf("%f\n",
var);
break;
case
'i':
printf("%d\n",
num);
break;
case
'x':
printf("%f\n",
max);
break;
case
'n':
printf("%f\n",
min);
break;
default:
printf("n
= %d, avg = %f, std = %f\n", num,
mean, std);
}
}