5

我遇到了一些奇怪的行为,至少在我自己的脑海中,在调试一些涉及确定加法操作是否会下溢双倍的代码时。这是一个演示我发现的示例程序。

#include <iostream>
#include <limits>

using std::cout;
using std::endl;
using std::numeric_limits;

int main()
{
    double lowest = numeric_limits<double>::lowest();
    bool truth = (lowest + 10000) == lowest;
    cout << truth << endl;
}

当我执行这段代码时,我得到了真实的结果。这是一个错误还是我只是睡眠不足?

4

1 回答 1

15

最小的双精度是:

-1.7976931348623157e+308

只有在双精度数超过 300 位的情况下,添加 10,000 或 1e4 才会有明显的效果,而他们绝对不会。双打只能容纳 15-17 位有效数字。

这两个数字之间的大小差异如此之大,以至于相加 10,000 不会产生一个新数字。事实上,最小的 double 是一个非常大的数字(可以这么说),您可以在其中添加一个googol——即 1 后跟一百个零——并且它不会改变。

于 2014-09-11T05:21:49.310 回答