#include "task.h" histogram.histogram(int nb, int ll, int rr) { register int i; if (rr<=ll || nb<1) task_error(E_HISTO,0); if (nb%2) nb++; while ((rr-ll)%nb) rr++; binsize = (rr-ll)/nb; h = new int[nb]; while (h == 0) task_error(E_STORE,0); for (i=0; i<nb; i++) h[i] = 0; l = ll; r = rr; nbin = nb; sum = 0; sqsum = 0; } void histogram.add(int a) /* add a to one of the bins, adjusting histogram, if necessary */ { register int i, j; /* make l <= a < r, */ /* possibly expanding histogram by doubling binsize and range */ while (a<l) { l -= r - l; for (i=nbin-1, j=nbin-2; 0<=j; i--, j-=2) h[i] = h[j] + h[j+1]; while(i >= 0) h[i--] = 0; binsize += binsize; } while (r<=a) { r += r - l; for (i=0, j=0; i<nbin/2 ; i++, j+=2) h[i] = h[j] + h[j+1]; while (i < nbin) h[i++] = 0; binsize += binsize; } sum += a; sqsum += a * a; h[(a-l)/binsize]++; } void histogram.print() /* printout non-empty ranges */ { register int i; register int x; int d = binsize; for (i=0; i<nbin; i++) { if (x=h[i]) { int ll = l+d*i; printf("[%d:%d) : %d\n",ll,ll+d,x); } } } /* int erand.draw() { int k; float a; for(k=0;;k++) { register float u1, u2; a = u1 = fdraw(); do { u2 = fdraw(); if (u1 < u2) return (int) k+a; u1 = fdraw(); } while (u1<u2); } } */