1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Experimental data distribution table generator 3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Taken from the uncopyrighted NISTnet code (public domain). 4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 5dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Read in a series of "random" data values, either 6dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * experimentally or generated from some probability distribution. 7dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * From this, create the inverse distribution table used to approximate 8dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * the distribution. 9dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdio.h> 11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdlib.h> 12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <math.h> 13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <malloc.h> 14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <string.h> 15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/types.h> 16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/stat.h> 17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatdouble * 20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatreaddoubles(FILE *fp, int *number) 21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct stat info; 23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat double *x; 24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int limit; 25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int n=0, i; 26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fstat(fileno(fp), &info); 28dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (info.st_size > 0) { 29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat limit = 2*info.st_size/sizeof(double); /* @@ approximate */ 30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat limit = 10000; 32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat x = calloc(limit, sizeof(double)); 35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!x) { 36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat perror("double alloc"); 37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat exit(3); 38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (i=0; i<limit; ++i){ 41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fscanf(fp, "%lf", &x[i]); 42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (feof(fp)) 43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat break; 44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ++n; 45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *number = n; 47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return x; 48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatvoid 51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatarraystats(double *x, int limit, double *mu, double *sigma, double *rho) 52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int n=0, i; 54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat double sumsquare=0.0, sum=0.0, top=0.0; 55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat double sigma2=0.0; 56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (i=0; i<limit; ++i){ 58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat sumsquare += x[i]*x[i]; 59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat sum += x[i]; 60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ++n; 61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *mu = sum/(double)n; 63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *sigma = sqrt((sumsquare - (double)n*(*mu)*(*mu))/(double)(n-1)); 64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (i=1; i < n; ++i){ 66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat top += ((double)x[i]- *mu)*((double)x[i-1]- *mu); 67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat sigma2 += ((double)x[i-1] - *mu)*((double)x[i-1] - *mu); 68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *rho = top/sigma2; 71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* Create a (normalized) distribution table from a set of observed 74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * values. The table is fixed to run from (as it happens) -4 to +4, 75dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * with granularity .00002. 76dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 77dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 78dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define TABLESIZE 16384/4 79dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define TABLEFACTOR 8192 80dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifndef MINSHORT 81dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define MINSHORT -32768 82dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define MAXSHORT 32767 83dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif 84dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 85dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* Since entries in the inverse are scaled by TABLEFACTOR, and can't be bigger 86dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * than MAXSHORT, we don't bother looking at a larger domain than this: 87dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 88dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define DISTTABLEDOMAIN ((MAXSHORT/TABLEFACTOR)+1) 89dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define DISTTABLEGRANULARITY 50000 90dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define DISTTABLESIZE (DISTTABLEDOMAIN*DISTTABLEGRANULARITY*2) 91dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 92dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int * 93dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatmakedist(double *x, int limit, double mu, double sigma) 94dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 95dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int *table; 96dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int i, index, first=DISTTABLESIZE, last=0; 97dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat double input; 98dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 99dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat table = calloc(DISTTABLESIZE, sizeof(int)); 100dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!table) { 101dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat perror("table alloc"); 102dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat exit(3); 103dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 104dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 105dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (i=0; i < limit; ++i) { 106dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat /* Normalize value */ 107dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat input = (x[i]-mu)/sigma; 108dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 109dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat index = (int)rint((input+DISTTABLEDOMAIN)*DISTTABLEGRANULARITY); 110dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (index < 0) index = 0; 111dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (index >= DISTTABLESIZE) index = DISTTABLESIZE-1; 112dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ++table[index]; 113dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (index > last) 114dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat last = index +1; 115dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (index < first) 116dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat first = index; 117dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 118dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return table; 119dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 120dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 121dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* replace an array by its cumulative distribution */ 122dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void 123dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatcumulativedist(int *table, int limit, int *total) 124dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 125dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int accum=0; 126dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 127dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat while (--limit >= 0) { 128dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat accum += *table; 129dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *table++ = accum; 130dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 131dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *total = accum; 132dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 133dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 134dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic short * 135dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatinverttable(int *table, int inversesize, int tablesize, int cumulative) 136dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 137dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int i, inverseindex, inversevalue; 138dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat short *inverse; 139dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat double findex, fvalue; 140dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 141dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat inverse = (short *)malloc(inversesize*sizeof(short)); 142dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (i=0; i < inversesize; ++i) { 143dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat inverse[i] = MINSHORT; 144dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 145dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (i=0; i < tablesize; ++i) { 146dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat findex = ((double)i/(double)DISTTABLEGRANULARITY) - DISTTABLEDOMAIN; 147dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fvalue = (double)table[i]/(double)cumulative; 148dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat inverseindex = (int)rint(fvalue*inversesize); 149dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat inversevalue = (int)rint(findex*TABLEFACTOR); 150dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (inversevalue <= MINSHORT) inversevalue = MINSHORT+1; 151dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (inversevalue > MAXSHORT) inversevalue = MAXSHORT; 152dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat inverse[inverseindex] = inversevalue; 153dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 154dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return inverse; 155dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 156dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 157dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 158dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* Run simple linear interpolation over the table to fill in missing entries */ 159dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void 160dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatinterpolatetable(short *table, int limit) 161dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 162dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int i, j, last, lasti = -1; 163dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 164dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat last = MINSHORT; 165dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (i=0; i < limit; ++i) { 166dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (table[i] == MINSHORT) { 167dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (j=i; j < limit; ++j) 168dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (table[j] != MINSHORT) 169dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat break; 170dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (j < limit) { 171dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat table[i] = last + (i-lasti)*(table[j]-last)/(j-lasti); 172dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 173dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat table[i] = last + (i-lasti)*(MAXSHORT-last)/(limit-lasti); 174dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 175dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 176dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat last = table[i]; 177dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat lasti = i; 178dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 179dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 180dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 181dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 182dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void 183dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatprinttable(const short *table, int limit) 184dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 185dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int i; 186dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 187dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat printf("# This is the distribution table for the experimental distribution.\n"); 188dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 189dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (i=0 ; i < limit; ++i) { 190dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat printf("%d%c", table[i], 191dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat (i % 8) == 7 ? '\n' : ' '); 192dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 193dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 194dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 195dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint 196dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatmain(int argc, char **argv) 197dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 198dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat FILE *fp; 199dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat double *x; 200dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat double mu, sigma, rho; 201dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int limit; 202dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int *table; 203dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat short *inverse; 204dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int total; 205dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 206dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (argc > 1) { 207dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!(fp = fopen(argv[1], "r"))) { 208dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat perror(argv[1]); 209dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat exit(1); 210dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 211dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 212dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fp = stdin; 213dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 214dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat x = readdoubles(fp, &limit); 215dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (limit <= 0) { 216dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Nothing much read!\n"); 217dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat exit(2); 218dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 219dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat arraystats(x, limit, &mu, &sigma, &rho); 220dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifdef DEBUG 221dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "%d values, mu %10.4f, sigma %10.4f, rho %10.4f\n", 222dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat limit, mu, sigma, rho); 223dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif 224dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 225dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat table = makedist(x, limit, mu, sigma); 226dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat free((void *) x); 227dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat cumulativedist(table, DISTTABLESIZE, &total); 228dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat inverse = inverttable(table, TABLESIZE, DISTTABLESIZE, total); 229dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat interpolatetable(inverse, TABLESIZE); 230dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat printtable(inverse, TABLESIZE); 231dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 232dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 233