我最近遇到一些奇怪的事情,我无法理解。
基本上我试图估计过去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的多人游戏?
如果有人能帮助我更好地理解这一点,我们将不胜感激!
答案 0 :(得分:4)
除了前两个之外的所有这些都执行整数运算,然后将整数结果转换为double
。奇怪的值是整数溢出的结果(它给出了未定义的行为)。如果使用浮点常量,则应该得到预期的结果,例如
test = 2. * 100. * 100. * 100. * 100. * 100.;