/* * Experimental data distribution table generator * Taken from the uncopyrighted NISTnet code (public domain). * * Rread in a series of "random" data values, either * experimentally or generated from some probability distribution. * From this, report statistics. */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <malloc.h> #include <sys/types.h> #include <sys/stat.h> void stats(FILE *fp) { struct stat info; double *x; int limit; int n=0, i; double mu=0.0, sigma=0.0, sumsquare=0.0, sum=0.0, top=0.0, rho=0.0; double sigma2=0.0; fstat(fileno(fp), &info); if (info.st_size > 0) { limit = 2*info.st_size/sizeof(double); /* @@ approximate */ } else { limit = 10000; } x = (double *)malloc(limit*sizeof(double)); for (i=0; i<limit; ++i){ fscanf(fp, "%lf", &x[i]); if (feof(fp)) break; sumsquare += x[i]*x[i]; sum += x[i]; ++n; } mu = sum/(double)n; sigma = sqrt((sumsquare - (double)n*mu*mu)/(double)(n-1)); for (i=1; i < n; ++i){ top += ((double)x[i]-mu)*((double)x[i-1]-mu); sigma2 += ((double)x[i-1] - mu)*((double)x[i-1] - mu); } rho = top/sigma2; printf("mu = %12.6f\n", mu); printf("sigma = %12.6f\n", sigma); printf("rho = %12.6f\n", rho); /*printf("sigma2 = %10.4f\n", sqrt(sigma2/(double)(n-1)));*/ /*printf("correlation rho = %10.6f\n", top/((double)(n-1)*sigma*sigma));*/ } int main(int argc, char **argv) { FILE *fp; if (argc > 1) { fp = fopen(argv[1], "r"); if (!fp) { perror(argv[1]); exit(1); } } else { fp = stdin; } stats(fp); return 0; }