[英]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.