今天,我浏览了一些 C++ 代码(由其他人编写)并找到了这个部分:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
我试图弄清楚这是否有意义。
epsilon()
的文档说:
该函数返回 1 和大于 1 的最小值之间的差值,该值可表示 [用双精度数]。
这是否也适用于 0,即 epsilon()
是大于 0 的最小值吗?或者 0
和 0 + epsilon
之间是否有可以用 double
表示的数字?
如果不是,那么比较不等于 someValue == 0.0
吗?
原文由 Sebastian Krysmanski 发布,翻译遵循 CC BY-SA 4.0 许可协议
假设 64 位 IEEE double,则有 52 位尾数和 11 位指数。让我们将其分解为:
大于 1 的最小可表示数:
所以:
0和epsilon之间有数字吗?很多……例如,最小的正可表示(正常)数是:
实际上有
(1022 - 52 + 1)×2^52 = 4372995238176751616
介于 0 和 epsilon 之间的数字,占所有可表示的正数的 47%…