2014-09-11 41 views
5

至少在我自己的想法中,我遇到了一些奇怪的行为,同时调试一些涉及确定添加操作是否会使双精度下溢的代码。这是一个演示我发现的示例程序。在numeric_limits中有一个错误,或者我只是困惑?

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

当我执行此代码时,我得到true作为结果。这是一个错误还是我只是睡觉剥夺?

回答

15

最小的双是:

-1.7976931348623157e+308 

增加10,000,或1E4,这只会有一个显着的影响,如果双打有300+位的精度,这是他们最肯定没有。双打只能保存15-17个有效数字。

这两个数字之间的差异非常大,以至于加上10,000并不会产生新的数字。实际上,最小加倍是这么大的数字(可以这么说),你可以增加一个googol它 - 它的后面跟着一百个零 - 它不会改变。

+0

OP(例如Matthew)绝对应该阅读http://floating-point-gui.de/ – 2014-09-11 05:25:29

+1

@MatthewPapageorge也看看:[双精度浮点格式](http://en.wikipedia.org/ wiki/Double-precision_floating-point_format) – Rimas 2014-09-11 05:29:37

+0

感谢您的迅速和明确的回应,约翰。对此,我真的非常感激。感谢Basile和Rimas阅读材料。 – 2014-09-11 05:34:42