|
|
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.