如何获得双倍的最小显着差异?
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)
是下一个最大的 double
在 x
.
之后
我有一个自动缩放图表,它试图适应从最小值到最大值的所有值。当我在图表上只有一个值时,它的比例当然是未定义的。所以我需要围绕这个数字创建一些最小的人工跨度:
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)
是下一个最大的 double
在 x
.