C ++双重/溢出问题

时间:2014-04-02 14:09:28

标签: c++ floating-point double

我最近遇到一些奇怪的事情,我无法理解。

基本上我试图估计过去2014年过去的秒数。然而,我得到的结果是负数。我首先想到,由于双浮点变量的大小限制,它是某种溢出,但是在研究之后似乎并非如此。所以我开始使用以下代码:

double test = 1.8*pow(10,308);
cout << test << endl;
test = 1.7*pow(10,308);
cout << test << endl;
test = 2*1000000000;
cout << test << endl;
test = 2*100*100*100*100*100;
cout << test << endl;
test = 1*1000000000;
cout << test << endl;
test = 1*100*100*100*100*100;
cout << test << endl;

这返回了以下输出:

inf
1.7e+308
2e+009
-1.47484e+009
1e+009
1.41007e+009

前两个结果对我有意义。我的印象是1.7e + 308是可以存储在double中的最大可能值,这意味着1.8e + 308不能工作 - 所以编译器将其解释为无穷大? 然而事情变得有点令人困惑。

我不明白为什么2 * 10000000000和2 * 100 * 100 * 100 * 100 * 100会返回不同的值?

为什么1 * 10000000000和1 * 100 * 100 * 100 * 100 * 100不会返回相同的值?

我也不明白为什么2 * 100 * 100 * 100 * 100 * 100会返回负值?

同样,1.4 ...来自于我只是1或2的多人游戏?

如果有人能帮助我更好地理解这一点,我们将不胜感激!

1 个答案:

答案 0 :(得分:4)

除了前两个之外的所有这些都执行整数运算,然后将整数结果转换为double。奇怪的值是整数溢出的结果(它给出了未定义的行为)。如果使用浮点常量,则应该得到预期的结果,例如

test = 2. * 100. * 100. * 100. * 100. * 100.;