2017-02-03 18 views
3

我知道一個float包含大量的數字和一些基數的指數,通常是十個。所以任何經過有效數字的東西都不準確,因爲什麼都沒有,但是當把一個float轉換爲int(或long)時,會出現虛假數字。將float轉換爲int時,尾部數字來自哪裏?

這裏有一個Python的例子:

>>> int(1e308) 
100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336L 

他們似乎並不一遍又一遍給定的值相同何時改變,所以它可能不是完全隨機的或從存儲器中的神祕斑點拉。這些隨機數字來自哪裏?究竟產生這些尾隨數字究竟發生了什麼?爲什麼轉換不會簡單地將隨機數字設置爲零?

回答

6

它們不是隨機的!並且轉換確實將所有「隨機」數字設置爲零。只是不在十位!

在Python(2.6及更高版本)中,您可以在任何浮點值上調用.hex()以更容易地看到它的存儲方式。用1e308,你得到'0x1.1ccf385ebc8a0p+1023'。在右邊你會看到兩個需要提高左邊的十六進制值的力量,它是輸入的值。在二進制中,十六進制值是1.00011100110011110011100001011110101111001000101

由2^1023乘以它只是由1023個地方留下

1000111001100111100111000010111101011110010001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

這正是int(1e308)移動小數點了。從浮點數到整數的轉換隻是將基數點轉換爲基數2,然後丟棄其餘部分。