struct histogram {
unsigned *data;
+ unsigned out_below, out_above;
unsigned allocated;
unsigned resolution;
};
size_t mem;
h->allocated = max_value/resolution + 1;
h->resolution = resolution;
+ h->out_below = h->out_above = 0;
mem = h->allocated*sizeof(*h->data);
h->data = malloc(mem);
if (h->data) {
void histogram_add(struct histogram *h, int value)
{
- if (value < 0) value = 0;
+ if (value < 0) {
+ h->out_below++;
+ return;
+ }
unsigned index = value / h->resolution;
- if (index >= h->allocated)
+ if (index >= h->allocated) {
+ h->out_above++;
index = h->allocated - 1;
+ }
h->data[index]++;
}
unsigned count;
unsigned long long sum;
unsigned avg;
+ unsigned below, above; /* Count of data out of histogram range */
unsigned percentile[101];
};
while (sum < i * s->count / 100)
sum += h->data[j++];
s->percentile[100] = (j-1) * h->resolution;
+
+ s->below = h->out_below;
+ s->above = h->out_above;
}
#endif