在numeric_limits中有错误还是我只是困惑?

时间:2014-09-11 05:15:48

标签: c++ double numeric-limits

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

#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;
}

当我执行此代码时,我得到了结果。这是一个错误还是我只是被剥夺了睡眠?

1 个答案:

答案 0 :(得分:15)

最小的双倍是:

-1.7976931348623157e+308

如果双精度具有300+以上的精度,那么将10,000或1e4添加到此只会产生明显的效果,但绝对不会这样。双打只能保持15-17位有效数字。

这两个数字之间的幅度差异非常大,以至于添加10,000不会产生新的数字。事实上,最小的双倍是这样一个巨大的数字(可以这么说),你可以添加一个 googol - 它是1然后是一百个零 - 它不会不要改变。