|
|
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) task_error(E_HISTO,0);
7: if (nb%2) nb++;
8: while ((rr-ll)%nb) rr++;
9: binsize = (rr-ll)/nb;
10: h = new int[nb];
11: while (h == 0) task_error(E_STORE,0);
12: for (i=0; i<nb; i++) h[i] = 0;
13: l = ll;
14: r = rr;
15: nbin = nb;
16: sum = 0;
17: sqsum = 0;
18: }
19:
20: void 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 histogram.print()
45: /*
46: printout non-empty ranges
47: */
48: {
49: register int i;
50: register int x;
51: int d = binsize;
52:
53: for (i=0; i<nbin; i++) {
54: if (x=h[i]) {
55: int ll = l+d*i;
56: printf("[%d:%d) : %d\n",ll,ll+d,x);
57: }
58: }
59: }
60:
61: /*
62: int erand.draw()
63: {
64: int k;
65: float a;
66:
67: for(k=0;;k++) {
68: register float u1, u2;
69: a = u1 = fdraw();
70: do {
71: u2 = fdraw();
72: if (u1 < u2) return (int) k+a;
73: u1 = fdraw();
74: } while (u1<u2);
75: }
76:
77: }
78: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.