1*de1e4e89SAndroid Build Coastguard Worker /*
2*de1e4e89SAndroid Build Coastguard Worker * Experimental data distribution table generator
3*de1e4e89SAndroid Build Coastguard Worker * Taken from the uncopyrighted NISTnet code (public domain).
4*de1e4e89SAndroid Build Coastguard Worker *
5*de1e4e89SAndroid Build Coastguard Worker * Rread in a series of "random" data values, either
6*de1e4e89SAndroid Build Coastguard Worker * experimentally or generated from some probability distribution.
7*de1e4e89SAndroid Build Coastguard Worker * From this, report statistics.
8*de1e4e89SAndroid Build Coastguard Worker */
9*de1e4e89SAndroid Build Coastguard Worker
10*de1e4e89SAndroid Build Coastguard Worker #include <stdio.h>
11*de1e4e89SAndroid Build Coastguard Worker #include <stdlib.h>
12*de1e4e89SAndroid Build Coastguard Worker #include <math.h>
13*de1e4e89SAndroid Build Coastguard Worker #include <malloc.h>
14*de1e4e89SAndroid Build Coastguard Worker #include <sys/types.h>
15*de1e4e89SAndroid Build Coastguard Worker #include <sys/stat.h>
16*de1e4e89SAndroid Build Coastguard Worker
17*de1e4e89SAndroid Build Coastguard Worker void
stats(FILE * fp)18*de1e4e89SAndroid Build Coastguard Worker stats(FILE *fp)
19*de1e4e89SAndroid Build Coastguard Worker {
20*de1e4e89SAndroid Build Coastguard Worker struct stat info;
21*de1e4e89SAndroid Build Coastguard Worker double *x;
22*de1e4e89SAndroid Build Coastguard Worker int limit;
23*de1e4e89SAndroid Build Coastguard Worker int n=0, i;
24*de1e4e89SAndroid Build Coastguard Worker double mu=0.0, sigma=0.0, sumsquare=0.0, sum=0.0, top=0.0, rho=0.0;
25*de1e4e89SAndroid Build Coastguard Worker double sigma2=0.0;
26*de1e4e89SAndroid Build Coastguard Worker
27*de1e4e89SAndroid Build Coastguard Worker fstat(fileno(fp), &info);
28*de1e4e89SAndroid Build Coastguard Worker if (info.st_size > 0) {
29*de1e4e89SAndroid Build Coastguard Worker limit = 2*info.st_size/sizeof(double); /* @@ approximate */
30*de1e4e89SAndroid Build Coastguard Worker } else {
31*de1e4e89SAndroid Build Coastguard Worker limit = 10000;
32*de1e4e89SAndroid Build Coastguard Worker }
33*de1e4e89SAndroid Build Coastguard Worker x = (double *)malloc(limit*sizeof(double));
34*de1e4e89SAndroid Build Coastguard Worker
35*de1e4e89SAndroid Build Coastguard Worker for (i=0; i<limit; ++i){
36*de1e4e89SAndroid Build Coastguard Worker fscanf(fp, "%lf", &x[i]);
37*de1e4e89SAndroid Build Coastguard Worker if (feof(fp))
38*de1e4e89SAndroid Build Coastguard Worker break;
39*de1e4e89SAndroid Build Coastguard Worker sumsquare += x[i]*x[i];
40*de1e4e89SAndroid Build Coastguard Worker sum += x[i];
41*de1e4e89SAndroid Build Coastguard Worker ++n;
42*de1e4e89SAndroid Build Coastguard Worker }
43*de1e4e89SAndroid Build Coastguard Worker mu = sum/(double)n;
44*de1e4e89SAndroid Build Coastguard Worker sigma = sqrt((sumsquare - (double)n*mu*mu)/(double)(n-1));
45*de1e4e89SAndroid Build Coastguard Worker
46*de1e4e89SAndroid Build Coastguard Worker for (i=1; i < n; ++i){
47*de1e4e89SAndroid Build Coastguard Worker top += ((double)x[i]-mu)*((double)x[i-1]-mu);
48*de1e4e89SAndroid Build Coastguard Worker sigma2 += ((double)x[i-1] - mu)*((double)x[i-1] - mu);
49*de1e4e89SAndroid Build Coastguard Worker
50*de1e4e89SAndroid Build Coastguard Worker }
51*de1e4e89SAndroid Build Coastguard Worker rho = top/sigma2;
52*de1e4e89SAndroid Build Coastguard Worker
53*de1e4e89SAndroid Build Coastguard Worker printf("mu = %12.6f\n", mu);
54*de1e4e89SAndroid Build Coastguard Worker printf("sigma = %12.6f\n", sigma);
55*de1e4e89SAndroid Build Coastguard Worker printf("rho = %12.6f\n", rho);
56*de1e4e89SAndroid Build Coastguard Worker /*printf("sigma2 = %10.4f\n", sqrt(sigma2/(double)(n-1)));*/
57*de1e4e89SAndroid Build Coastguard Worker /*printf("correlation rho = %10.6f\n", top/((double)(n-1)*sigma*sigma));*/
58*de1e4e89SAndroid Build Coastguard Worker }
59*de1e4e89SAndroid Build Coastguard Worker
60*de1e4e89SAndroid Build Coastguard Worker
61*de1e4e89SAndroid Build Coastguard Worker int
main(int argc,char ** argv)62*de1e4e89SAndroid Build Coastguard Worker main(int argc, char **argv)
63*de1e4e89SAndroid Build Coastguard Worker {
64*de1e4e89SAndroid Build Coastguard Worker FILE *fp;
65*de1e4e89SAndroid Build Coastguard Worker
66*de1e4e89SAndroid Build Coastguard Worker if (argc > 1) {
67*de1e4e89SAndroid Build Coastguard Worker fp = fopen(argv[1], "r");
68*de1e4e89SAndroid Build Coastguard Worker if (!fp) {
69*de1e4e89SAndroid Build Coastguard Worker perror(argv[1]);
70*de1e4e89SAndroid Build Coastguard Worker exit(1);
71*de1e4e89SAndroid Build Coastguard Worker }
72*de1e4e89SAndroid Build Coastguard Worker } else {
73*de1e4e89SAndroid Build Coastguard Worker fp = stdin;
74*de1e4e89SAndroid Build Coastguard Worker }
75*de1e4e89SAndroid Build Coastguard Worker stats(fp);
76*de1e4e89SAndroid Build Coastguard Worker return 0;
77*de1e4e89SAndroid Build Coastguard Worker }
78