2015-04-24 29 views
1

我写了下面的程序:为什么两次连续铸造改变一个整数?

#include <iostream> 

int main() 
{ 
    int i =123456789; 
    float f=i; 
    int j=f; 
    std::cout<<"j-i ="<<j-i; 
} 

据我们所知,浮点数在存储器中具有至少4个字节长度。和123456789十进制等于0x75BCD15十六进制,这是小于4个字节。所以我为什么当我运行上述程序时,输出不是0

[email protected]:~$ ./a.out 
j-i = 3 
+2

'float数字至少有4个字节长度吗?我不认为这个标准确实如此 - 像往常一样。 – ikh

+2

仅仅因为sizeof(float)== sizeof(int)'并不意味着它们在精度等问题上是相等的。您可能需要阅读[IEEE浮点格式](http://en.wikipedia.org/wiki/IEEE_floating_point#Formats),这是计算机上浮点值最常用的格式。 –

+2

一个简单的,但足够好的,最重要的可访问的浮点数介绍是[Barteks介绍浮点数](http://2013.jsconf.eu/speakers/bartek-szopka-everything-you-never-wanted了解JavaScript的数字和你没有知道你可以ask.html)在jsconf谈话。它实际上覆盖了JS,但99%的谈话是关于浮点数的标准,因此与其相关。 –

回答

12

因为float只有23位精度(*)。其他9位是符号和指数所需要的。这意味着在16,777,216之后,您会在“整数”浮动范围内出现漏洞。

(*)实际上是24位,但只需要存储23位;第一位由指数暗示。