簡體   English   中英

有人可以解釋這個浮點行為嗎?

[英]Can someone explain this floating-point behavior?

這個問題的啟發,我試圖找出那里到底發生什么 (我的答案更直觀,但我不能完全理解它的原因)。

我相信它歸結為此(運行64位Python):

>>> sys.maxint
9223372036854775807
>>> float(sys.maxint)
9.2233720368547758e+18

Python使用IEEE 754浮點表示,有效地為53位。 但是,據我所知,上面例子中的重要內容需要57位(如果丟棄隱含的前導1,則為56位)。 有人可以解釋這種差異嗎?

也許以下內容有助於澄清問題:

>>> hex(int(float(sys.maxint)))
'0x8000000000000000L'

這表明float(sys.maxint)實際上是2的冪。因此,在二進制中,它的尾數恰好為1 在IEEE 754中,隱含了前導1.因此在機器表示中,該數字的尾數由所有零比特組成。

實際上,表示此數字的IEEE位模式如下:

0x43E0000000000000

觀察到只有前三個半字節(符號和指數)不為零。 有效數字完全由零組成。 因此,它不需要表示56(也不是53)位。

你錯了。 它需要1位。

>>> (9.2233720368547758e+18).hex()
'0x1.0000000000000p+63'

當您將sys.maxint轉換為float或double時,結果正好是0x1p63,因為有效位數僅包含24或53位(包括隱含位),因此尾隨位會導致向上舍入。 (sys.maxint為2 ^ 63 - 1,向上舍入產生2 ^ 63。)

然后,當您打印此浮動時,某些子例程將其格式化為十進制數字。 為此,它計算數字以表示2 ^ 63。 它能夠打印9.2233720368547758e + 18這一事實並不意味着原始數字包含的區別於9.2233720368547759e + 18。 它很簡單意味着它中的位確實代表9.2233720368547758e + 18(大約)。 實際上,雙精度的下一個可表示的浮點數是9223372036854777856(大約9.2233720368547778e + 18),這是2 ^ 63 + 2048.因此這些整數的低11位不存在於double中。 格式化程序僅顯示數字,就好像這些位為零一樣。

暫無
暫無

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

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