- if ( ! (n % 2 ) ) n++;
- upper_limit = n * bin_width_2;
-
- n = floor (min / (bin_width_2) ) ;
- if ( ! (n % 2 ) ) n--;
- lower_limit = n * bin_width_2;
+ lower_limit = floor (min / half_bin_width) - 1;
+ upper_limit = floor (max / half_bin_width) + 1;
+
+ if (remainder (min, half_bin_width > remainder (max, half_bin_width)))
+ sparse_end = -1;
+ else
+ sparse_end = +1;
+
+ /* The range must be an EVEN number of half bin_widths */
+ if ( (int)(upper_limit - lower_limit) % 2)
+ {
+ /* Extend the range at the end which gives the least unused space */
+ if (sparse_end == +1)
+ lower_limit --;
+ else
+ upper_limit ++;
+
+ /* Now the other end has more space */
+ sparse_end *= -1;
+ }
+
+ /* But the range should be aligned to an ODD number of
+ half bin widths, so that the labels are aesthetically pleasing ones. */
+ if ( (int)lower_limit % 2 == 0)
+ {
+ lower_limit += -sparse_end ;
+ upper_limit += -sparse_end ;
+ }
+
+ bins = (upper_limit - lower_limit) / 2.0;
+
+ /* Force the number of bins to lie in a sensible range */
+ if (bins > 25)
+ bins = 25;
+
+ if (bins < 1)
+ bins = 1;
+
+ upper_limit *= half_bin_width;
+ lower_limit *= half_bin_width;