- struct histogram *h = xmalloc (sizeof *h);
- struct statistic *stat = (struct statistic *) h;
- double upper_limit, lower_limit;
+ double lower, interval;
+ int n_ticks;
+ double binwidth;
+ int nbins;
+
+ chart_get_scale (max, min, &lower, &interval, &n_ticks);
+
+ if (bin_width_in >= 2 * interval)
+ {
+ binwidth = floor(bin_width_in/interval) * interval;
+ *adjusted_min = lower;
+ }
+ else if (bin_width_in >= 1.5 * interval)
+ {
+ binwidth = 1.5 * interval;
+ if (min < (lower + 0.5 * interval))
+ *adjusted_min = lower;
+ else
+ *adjusted_min = lower + 0.5 * interval;
+ }
+ else if (bin_width_in >= interval)
+ {
+ binwidth = interval;
+ *adjusted_min = lower;
+ }
+ else if (bin_width_in >= (2.0/3.0 * interval))
+ {
+ binwidth = (2.0/3.0 * interval);
+ if (min >= lower + binwidth)
+ *adjusted_min = lower + binwidth;
+ else
+ *adjusted_min = lower;
+ }
+ else
+ {
+ int i;
+ for(i = 2; bin_width_in < interval/i; i++);
+ binwidth = interval/i;
+ *adjusted_min = floor((min - lower)/binwidth)*binwidth + lower;
+ }
+
+ nbins = ceil((max-*adjusted_min)/binwidth);
+ *adjusted_max = nbins*binwidth + *adjusted_min;
+
+ /* adjusted_max should never be smaller than max but if it is equal
+ then the gsl_histogram will not add the cases which have max value */
+ if (*adjusted_max <= max)
+ {
+ *adjusted_max += binwidth;
+ nbins++;
+ }
+ assert (*adjusted_min <= min);
+
+ return nbins;
+}