C++ Double size/溢出问题

标签 c++ floating-point double

我最近遇到了一些我无法理解的怪事。

基本上,我试图估算过去 2014 年过去的秒数。但是,我得到的结果是负数。起初我认为这是由于 double 浮点变量的大小限制导致的某种溢出,但在调查之后似乎并非如此。所以我开始尝试使用以下代码:

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 或 2 进行多人游戏时,1.4... 来自哪里?

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

最佳答案

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

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

关于C++ Double size/溢出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22814140/

相关文章:

c - +0.0 和 -0.0 上的哪些运算和函数给出不同的算术结果?

c++ - 禁止警告 “QApplication was not created in main() thread”

c++ - 添加临时对象时 emplace_back 是否比 push_back 更好?

python - 创建一个程序,返回超过非负整数 n 的最小立方体

Java:构造函数参数( double 类型)始终为 0

java - 检查输入是否为数字时出现逻辑错误,如果不是则重新请求用户输入直到有效

C#:如何将 TimeSpan 值转换为 double 值?

c++ - 当您调用 new[] 为 N 个整数分配一个数组时,是否保证该数组将按顺序分配到物理内存中?

c++ - 如何在 Mac OS X Mavericks 上链接标准 C++ 库?

c - IEEE 754 : sqrtf() with fesetround(): different results between compilers: 0x42440a72 vs. 0x42440a73