为什么双重类型返回Infinity?

时间:2017-12-22 13:24:07

标签: c++

我在C ++中创建此代码只是为了检查数据类型可以存储的最大整数 int double

#include<iostream>
using namespace std;
int main() {
    int a, b;
    cin >> a;
    b = a;
    for(int c; a > 1; a = a * b)
        cout << a << "\n";
};

当我在下面的代码中输入2时,打印的最大整数是1073741824。

我将代码更改为:

#include<iostream>

using namespace std;

double main() {
    double a, b;
    cin >> a;
    b = a;
    for(double c; a > 1; a = a * b)
        cout << a << "\n";
};

第二个代码的输出从2快速打印到无穷大。 为什么代码不会停止在double的最大值?为什么它会在之前的代码中停止?

3 个答案:

答案 0 :(得分:5)

溢出int时的行为是未定义。因此,无法阐明可以存储在int中的最大可能值。因此,我们必须依赖您的平台为您提供的常量:std::numeric_limits<int>::max()是最大int的值。

对于double案例,从技术上讲,行为也是 undefined 。虽然如果你的平台实现IEEE754,那么+ Inf最终将通过重复乘以足够大的值来实现;略高于1 1 。您平台支持的最大double +Infstd::numeric_limits<double>::max()

最后,main不允许返回int以外的任何内容。你的编译器没有警告过你吗?

1 “一点点”的实际值是std::numeric<double>::epsilon()。 Acknowledge @YSC。

答案 1 :(得分:1)

  

我在C ++中创建此代码只是为了检查最大的整数int和双数据类型可以存储

这是您获得可以存储在数据类型中的最大值的方法:

a

即使定义明确,您的试用乘法也不会正确:它只会显示a的最后一个值,使得实际最大值介于a*b和{之间{1}}。

答案 2 :(得分:0)

为什么代码不会停在double的最大值?

因为infinity > 1始终为真。

为什么它会在之前的代码中停止?

由于在您的平台上a从0x40000000(十进制1073741824)翻转到0x80000000(十进制-2147483648)时未定义的行为(或平台特定行为),-2147483648 > 1为false。