From 02b9c714f6867eb7bcfd2806804ab395051cb661 Mon Sep 17 00:00:00 2001 From: William Joye Date: Tue, 17 Jul 2018 11:41:21 -0400 Subject: Squashed 'tkblt/' changes from 061316ce..c383650b c383650b Merge pull request #14 from prs-de/fix-subnormal-axis-range-segfault f4f7bb6a Expand scale range to be at least DBL_EPSILON git-subtree-dir: tkblt git-subtree-split: c383650b64c994ae63e57aab6bb8cd193f8537da --- generic/tkbltGrAxis.C | 28 ++++++++++++++++++++-------- 1 file 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; } -- cgit v0.12