Float是inf但是C ++中的整数不是inf - xCode。为什么?

时间:2018-03-22 20:16:52

标签: c++ xcode int

可能这是一个基本问题。但我无法弄清楚,并找到答案。

我知道int的最高编号为:-2147483648

当我通过该限制时,编译器始终显示最高值。

float而言:3.4e+38(或减号,但不是重点)

当我传递float的限制时,编译器始终显示inf。为什么不3.4e+38-3.4e-38 ???

我的代码是这样的:

int bytesT=8*5;
int a=0;

for (int i=0; i<bytesT; i++)
{
    a += pow(2, i);
}
std::cout << "a = " << a << std::endl;


float b= 3.4 * pow(10, 39);
std::cout << "b = " << b << std::endl;

它给了我那个结果:

a = -2147483648
b = inf

有人可以解释这种行为吗?提前谢谢。

3 个答案:

答案 0 :(得分:1)

float代表一个大于相应浮点类型可能容纳的值。因此,如果3.4e+38的最高值为3.4 * pow(10, 39),则39会更大(请注意float),以便inf将此值表示为特殊值3.4 * pow(10, 38)。但是,如果您编写<limits>,您将获得(几乎)最高值。

实际最高(和最低)数字在#include <limits> int main() { float b= 3.4 * pow(10, 38); float c= std::numeric_limits<float>::max(); cout << b << " " << c << endl; int imax = std::numeric_limits<int>::max(); int imin = std::numeric_limits<int>::min(); cout << imin << " " << imax << endl; } 中提供:

a += pow(2, i)

这可以避免整数溢出,您可以使用id在代码中获得整数溢出。请注意,整数溢出是未定义的行为,并且 - 即使它经常工作&#34;按预期&#34; - 不保证完全可以工作。根据C ++ 11标准的第5/4段(关于任何表达式):

  

如果在评估表达式期间,结果不是   在数学上定义或不在可表示值的范围内   它的类型,行为是未定义的。 [...]

答案 1 :(得分:0)

整数通常不具有“无限”或任何其他标记状态。他们只有价值观。你在这里用2的幂做的是将比特逐个设置为1,int为32bit。这意味着你最终得到的值是两个补码是signed int可以拥有的最小值。如果值是无符号的,那么它将是最大的。如果添加到32位值,则在最低32位中具有全零的值不会发生任何变化。所以你最终会得到这个价值。

(IEEE)浮点值的工作方式不同。它们具有指示无穷大的标志,而不是数字等。因此,当值超出界限时使用它们是有意义的。这就是为什么当你添加太多数字并且值超出界限时你最终会使用inf。

如果你继续向int变量添加1,你会发现它不会保留在任何单个值中。它会溢出并继续前进。我不确定C ++规范定义了多少应该如何处理它们,所以它甚至可能是特定于实现的,但通常值溢出并继续保持不变。

答案 2 :(得分:0)

I'm gonna try to make this as simple as possible:  

int = 32 bits:
0000 0000 0000 0000 0000 0000 0000 0000  
left-most bit represents sign, so largest int32 number that you can have is:  
0111 1111 1111 1111 1111 1111 1111 1111 (which is 2147483647)

for negative numbers if left-most bit is set to 1 then to get "human readable"  
number you will have to do complement 2 of that number which is invert every bit  
and add 1.

ex.
1111 1111 1111 1111 1111 1111 1111 1111  <- my number (i know it is negative, -?)  
0000 0000 0000 0000 0000 0000 0000 0000  <- all bits converted  
0000 0000 0000 0000 0000 0000 0000 0001  <- added 1    
=> so that begging number was -1  

Now that you know this, question is what happens if you add 1 to the   
largest positive int32 number (0111 1111 1111 1111 1111 1111 1111 1111) ?  

Well you will get 1000 0000 0000 0000 0000 0000 0000 0000
which is (-2147483648). What happened here was overflow caused by addition.  
This was the case in your program for your 'a' variable.

- As for your confusion with 'inf': 

Floating point numbers work differently then integers.  
I'm not gonna go into too much detail on how bits and bytes are arranged.
Just know that there is :  
 - 1 bit reserved for sign (top-left)   
 - next 8 (for float32) bits for exponent   
 - and the rest for fraction  
Now what is interesting is that there are certain 'special' values defined in
IEEE 754 which are the following:

 - +0 = 0 00000000 00000000000000000000000  
 - -0 = 1 00000000 00000000000000000000000  
 - +inf = 0 11111111 00000000000000000000000
 - -inf = 1 11111111 00000000000000000000000
 - NaN = 0 11111111 00000000000000000000001

As you see these special values are not defined in int type which is the reason  
why you get 'inf' in float and something weird/unexpected in int.

I hope i answered your question.