如何获得双倍的最小显着差异?

How to get minimal significant difference for a double?

我有一个自动缩放图表,它试图适应从最小值到最大值的所有值。当我在图表上只有一个值时,它的比例当然是未定义的。所以我需要围绕这个数字创建一些最小的人工跨度:

if (span < MIN_SPAN) {
  double amount = (MIN_SPAN - span) / 2;
  this.end += amount;
  this.start -= amount;
}

如果 MIN_SPAN 比方说 1e-100,当我的唯一值为 0 时它将正常工作。但如果它是 1 或更多,它将停止正常工作。可能是因为浮点数的性质:1和1e-100之间的差异小于double的小数精度。

所以,问题:如何计算特定双精度值的最小显着跨度?

double getMinSpan(double value) {
// ...
}

您几乎肯定在寻找 Math.ulp,returns double 的“最小 epsilon”:x + Math.ulp(x) 是下一个最大的 doublex.

之后