2015-04-24 31 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位;第一位由指數暗示。