簡體   English   中英

將float轉換為int時,尾隨數字來自何處?

[英]Where do the trailing digits come from when converting a float to an int?

我知道浮點數包含大量的數字和一些基數的指數,通常為十。 因此,通過有效數字的任何東西都不會准確,因為沒有任何東西,但是當將float轉換為int(或long)時,會出現虛假數字。

這是一個Python示例:

>>> int(1e308)
100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336L

當一遍又一遍地給出相同的值時,它們似乎沒有改變,所以它可能不是完全隨機的或從記憶中的神秘位置拉出來的。 這些隨機數字來自哪里? 究竟是什么產生這些尾隨數字? 為什么轉換只是將隨機數設置為零?

他們不是隨意的! 並且轉換確實將所有“隨機”數字設置為零。 只是不在十點!

在Python(2.6及更高版本)中,您可以在任何浮點值上調用.hex()以更容易地查看它是如何存儲的。 使用1e308 ,你得到'0x1.1ccf385ebc8a0p+1023' 在右側,您將看到提升左側十六進制值所需的2的冪,使其成為輸入的值。 在二進制中,十六進制值為1.00011100110011110011100001011110101111001000101

將它乘以2 ^ 1023只會將小數點移動1023個位置

1000111001100111100111000010111101011110010001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

這正是int(1e308) 從float到integer的轉換只是簡化了基數為2的小數點,然后丟棄其余的小數點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM