(_min, _max, cfg)
| 200 | } |
| 201 | |
| 202 | function _rangeNum(_min, _max, cfg) { |
| 203 | let cmin = cfg.min; |
| 204 | let cmax = cfg.max; |
| 205 | |
| 206 | let padMin = ifNull(cmin.pad, 0); |
| 207 | let padMax = ifNull(cmax.pad, 0); |
| 208 | |
| 209 | let hardMin = ifNull(cmin.hard, -inf); |
| 210 | let hardMax = ifNull(cmax.hard, inf); |
| 211 | |
| 212 | let softMin = ifNull(cmin.soft, inf); |
| 213 | let softMax = ifNull(cmax.soft, -inf); |
| 214 | |
| 215 | let softMinMode = ifNull(cmin.mode, 0); |
| 216 | let softMaxMode = ifNull(cmax.mode, 0); |
| 217 | |
| 218 | let delta = _max - _min; |
| 219 | let deltaMag = log10(delta); |
| 220 | |
| 221 | let scalarMax = max(abs(_min), abs(_max)); |
| 222 | let scalarMag = log10(scalarMax); |
| 223 | |
| 224 | let scalarMagDelta = abs(scalarMag - deltaMag); |
| 225 | |
| 226 | // this handles situations like 89.7, 89.69999999999999 |
| 227 | // by assuming 0.001x deltas are precision errors |
| 228 | // if (delta > 0 && delta < abs(_max) / 1e3) |
| 229 | // delta = 0; |
| 230 | |
| 231 | // treat data as flat if delta is less than 1e-24 |
| 232 | // or range is 11+ orders of magnitude below raw values, e.g. 99999999.99999996 - 100000000.00000004 |
| 233 | if (delta < 1e-24 || scalarMagDelta > 10) { |
| 234 | delta = 0; |
| 235 | |
| 236 | // if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback |
| 237 | // this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1 |
| 238 | if (_min == 0 || _max == 0) { |
| 239 | delta = 1e-24; |
| 240 | |
| 241 | if (softMinMode == 2 && softMin != inf) |
| 242 | padMin = 0; |
| 243 | |
| 244 | if (softMaxMode == 2 && softMax != -inf) |
| 245 | padMax = 0; |
| 246 | } |
| 247 | } |
| 248 | |
| 249 | let nonZeroDelta = delta || scalarMax || 1e3; |
| 250 | let mag = log10(nonZeroDelta); |
| 251 | let base = pow(10, floor(mag)); |
| 252 | |
| 253 | let _padMin = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin); |
| 254 | let _newMin = roundDec(incrRoundDn(_min - _padMin, base/10), 24); |
| 255 | let _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf; |
| 256 | let minLim = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin)); |
| 257 | |
| 258 | let _padMax = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax); |
| 259 | let _newMax = roundDec(incrRoundUp(_max + _padMax, base/10), 24); |
no test coverage detected
searching dependent graphs…