static short * dist_make(FILE *fp, double *mu, double *sigma, double *rho) { int limit; double *x; int *table; short *inverse; int total; x = readdoubles(fp, &limit); if (limit <= 0) error(-1, 0, "Nothing much read!"); arraystats(x, limit, mu, sigma, rho); fprintf(stderr, "Read %d values, mu %10.4f, sigma %10.4f, rho %10.4f\n", limit, *mu, *sigma, *rho); table = makedist(x, limit, *mu, *sigma); free((void *) x); cumulativedist(table, DISTTABLESIZE, &total); inverse = inverttable(table, TABLESIZE, DISTTABLESIZE, total); interpolatetable(inverse, TABLESIZE); return inverse; }
int main(int argc, char **argv) { FILE *fp; double *x; double mu, sigma, rho; int limit; int *table; short *inverse; int total; if (argc > 1) { if (!(fp = fopen(argv[1], "r"))) { perror(argv[1]); exit(1); } } else { fp = stdin; } x = readdoubles(fp, &limit); if (limit <= 0) { fprintf(stderr, "Nothing much read!\n"); exit(2); } arraystats(x, limit, &mu, &sigma, &rho); #ifdef DEBUG fprintf(stderr, "%d values, mu %10.4f, sigma %10.4f, rho %10.4f\n", limit, mu, sigma, rho); #endif table = makedist(x, limit, mu, sigma); free((void *) x); cumulativedist(table, DISTTABLESIZE, &total); inverse = inverttable(table, TABLESIZE, DISTTABLESIZE, total); interpolatetable(inverse, TABLESIZE); printtable(inverse, TABLESIZE); return 0; }