#include "libpspp/compiler.h"
-#include "math/decimal.h"
#include "math/chart-geometry.h"
#include <limits.h>
#include <float.h>
#if 0
static void
-dump_scale (const struct decimal *low, const struct decimal *interval, int n_ticks)
+dump_scale (const double low, const double interval, int n_ticks)
{
int i;
- struct decimal tick = *low;
+ double tick = low;
for (i = 0; i <= n_ticks; ++i)
{
- printf ("Tick %d: %s (%g)\n", i, decimal_to_string (&tick), decimal_to_double (&tick));
- decimal_add (&tick, interval);
+ printf ("Tick %d: %g\n", i, tick);
+ tick += interval;
}
}
#endif
test_range (double low, double high)
{
int n_ticks = 0;
- struct decimal interval;
- struct decimal lower;
+ double interval;
+ double lower;
chart_get_scale (high, low,
&lower, &interval, &n_ticks);
- assert (n_ticks > 0);
- assert (n_ticks < 12);
-
- // dump_scale (&lower, &interval, n_ticks);
-
- assert (decimal_to_double (&lower) <= low);
-
- {
- struct decimal l = lower;
- decimal_add (&l, &interval);
- assert (decimal_to_double (&l) > low);
+ if ((high - low) < 10 * DBL_MIN){
+ assert (n_ticks == 0);
+ assert (lower == low);
+ assert (interval <= 10 * DBL_MIN);
}
+ else
+ assert (n_ticks > 4);
- {
- struct decimal i = interval;
-
- decimal_int_multiply (&i, n_ticks - 1);
-
- decimal_add (&i, &lower);
+ assert (n_ticks <= 10);
- /* i now contains the upper bound minus one tick */
- assert (decimal_to_double (&i) < high);
-
- decimal_add (&i, &interval);
+#if 0
+ printf("%s: high: %lg, low %lg, interval: %lg, nticks: %d\n",
+ __FUNCTION__, high, low, interval, n_ticks);
+ dump_scale (lower, interval, n_ticks);
+#endif
- assert (decimal_to_double (&i) >= high);
+ if ((high - low) > 10 * DBL_MIN) {
+ assert (lower <= low);
+ assert (lower + interval > low);
+ assert (lower + n_ticks * interval < high);
+ assert (lower + (n_ticks + 1) * interval >= high);
}
-
}
-int
+int
main (int argc UNUSED, char **argv UNUSED)
{
+ test_range (0, 0);
+ test_range (5, 5);
+ test_range (-5, -5);
+ test_range (0, 7);
test_range (0.2, 11);
test_range (-0.2, 11);
test_range (-10, 0.2);
test_range (-10, -0.2);
+ test_range (-10000, 10003);
+ test_range (50042,50053);
+ test_range (-50010, -49999);
+ test_range (0.000100002, 0.000100010);
- test_range (102, 50030);
- test_range (0.00102, 0.0050030);
+ test_range (102, 50030);
+ test_range (0.00102, 0.0050030);
return 0;
}