summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2018-07-17 15:38:34 (GMT)
committerGitHub <noreply@github.com>2018-07-17 15:38:34 (GMT)
commitc383650b64c994ae63e57aab6bb8cd193f8537da (patch)
tree0697daecd7a74acd5cfc8da737177ee67d23154d
parent061316ced72f9e6bc09e36e8fb42b41465e953ce (diff)
parentf4f7bb6aaad924ee83d7cc6b5b90c7c89083b698 (diff)
downloadblt-c383650b64c994ae63e57aab6bb8cd193f8537da.zip
blt-c383650b64c994ae63e57aab6bb8cd193f8537da.tar.gz
blt-c383650b64c994ae63e57aab6bb8cd193f8537da.tar.bz2
Merge pull request #14 from prs-de/fix-subnormal-axis-range-segfault
Expand scale range to be at least DBL_EPSILON
-rw-r--r--generic/tkbltGrAxis.C28
1 files changed, 20 insertions, 8 deletions
diff --git a/generic/tkbltGrAxis.C b/generic/tkbltGrAxis.C
index bac6316..8532600 100644
--- a/generic/tkbltGrAxis.C
+++ b/generic/tkbltGrAxis.C
@@ -819,18 +819,30 @@ void Axis::linearScale(double min, double max)
double range = max - min;
if (ops->reqStep > 0.0) {
step = ops->reqStep;
- while ((2 * step) >= range)
+ while ((2 * step) >= range && step >= (2 * DBL_EPSILON)) {
step *= 0.5;
- }
+ }
+ }
else {
range = niceNum(range, 0);
step = niceNum(range / ops->reqNumMajorTicks, 1);
}
-
- axisMin = tickMin = floor(min / step) * step + 0.0;
- axisMax = tickMax = ceil(max / step) * step + 0.0;
-
- nTicks = (int)((tickMax-tickMin) / step) + 1;
+ if (step >= DBL_EPSILON) {
+ axisMin = tickMin = floor(min / step) * step + 0.0;
+ axisMax = tickMax = ceil(max / step) * step + 0.0;
+ nTicks = (int)((tickMax-tickMin) / step) + 1;
+ } else {
+ /*
+ * A zero step can result from having a too small range, such that
+ * the floating point can no longer represent fractions of it (think
+ * subnormals). In such a case, let's just have two steps: the
+ * minimum and the maximum.
+ */
+ axisMin = tickMin = min;
+ axisMax = tickMax = min + DBL_EPSILON;
+ step = DBL_EPSILON;
+ nTicks = 2;
+ }
}
majorSweep_.step = step;
majorSweep_.initial = tickMin;
@@ -870,7 +882,7 @@ void Axis::setRange(AxisRange *rangePtr, double min, double max)
rangePtr->max = max;
rangePtr->range = max - min;
if (fabs(rangePtr->range) < DBL_EPSILON) {
- rangePtr->range = 1.0;
+ rangePtr->range = DBL_EPSILON;
}
rangePtr->scale = 1.0 / rangePtr->range;
}