|
|
1.1 ! root 1: #include "task.h" ! 2: ! 3: histogram::histogram(int nb, int ll, int rr) ! 4: { ! 5: register int i; ! 6: if (rr<=ll || nb<1) ((object*)0)->task_error(E_HISTO); ! 7: if (nb%2) nb++; ! 8: while ((rr-ll)%nb) rr++; ! 9: binsize = (rr-ll)/nb; ! 10: h = new int[nb]; ! 11: for (i=0; i<nb; i++) h[i] = 0; ! 12: l = ll; ! 13: r = rr; ! 14: nbin = nb; ! 15: sum = 0; ! 16: sqsum = 0; ! 17: } ! 18: ! 19: void ! 20: histogram::add(int a) ! 21: /* add a to one of the bins, adjusting histogram, if necessary */ ! 22: { ! 23: register int i, j; ! 24: ! 25: /* make l <= a < r, */ ! 26: /* possibly expanding histogram by doubling binsize and range */ ! 27: while (a<l) { ! 28: l -= r - l; ! 29: for (i=nbin-1, j=nbin-2; 0<=j; i--, j-=2) h[i] = h[j] + h[j+1]; ! 30: while(i >= 0) h[i--] = 0; ! 31: binsize += binsize; ! 32: } ! 33: while (r<=a) { ! 34: r += r - l; ! 35: for (i=0, j=0; i<nbin/2 ; i++, j+=2) h[i] = h[j] + h[j+1]; ! 36: while (i < nbin) h[i++] = 0; ! 37: binsize += binsize; ! 38: } ! 39: sum += a; ! 40: sqsum += a * a; ! 41: h[(a-l)/binsize]++; ! 42: } ! 43: ! 44: void ! 45: histogram::print() ! 46: /* ! 47: printout non-empty ranges ! 48: */ ! 49: { ! 50: register int i; ! 51: register int x; ! 52: int d = binsize; ! 53: ! 54: for (i=0; i<nbin; i++) { ! 55: if (x=h[i]) { ! 56: int ll = l+d*i; ! 57: printf("[%d:%d) : %d\n",ll,ll+d,x); ! 58: } ! 59: } ! 60: } ! 61: ! 62: /* ! 63: int ! 64: erand::draw() ! 65: { ! 66: int k; ! 67: float a; ! 68: ! 69: for(k=0;;k++) { ! 70: register float u1, u2; ! 71: a = u1 = fdraw(); ! 72: do { ! 73: u2 = fdraw(); ! 74: if (u1 < u2) return (int) k+a; ! 75: u1 = fdraw(); ! 76: } while (u1<u2); ! 77: } ! 78: ! 79: } ! 80: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.