2013-12-11 85 views
1

我們知道python浮點數是64bit。我參加考試:Python:什麼float(2 ** 53 + 3)將是

float(2**53) is 9007199254740992.0, 

,它是確定

float(2**53+1) is also 9007199254740992.0, 

,它是確定的,因爲最後1不能在64位二進制來呈現。

float(2**53+3) is equal to float(2**53+2), 

float(2**53+3) is **9007199254740996.0** 

結果如何在Python的浮點數的工作?

+0

'double'在C中工作的方式相同。 – dan04

+0

在我的系統中,float(2 * 53 + 2)== 108.0'和float(2 * 53 + 3)== 109.0'。我懷疑這種溢出是未定義的行爲,你不應該依賴它。 –

+4

[每個計算機科學家應該知道的關於浮點算術](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768) – devnull

回答

0

請注意,2**53+3是一個int64,所以沒有問題,如果你在Python中評估它會給你正確的答案9007199254740995

然而,float64有小數部分52位,所以當你做float(2**53+3)轉換9007199254740995float64,你失去精度,並得到圓附近的數:9007199254740996.0

+0

但是爲什麼*表示特定數字而不是9007199254740994。0這也是可代表​​的?特別是當'float(9007199254740993)'返回9007199254740992.0。 –

+0

@SteveJessop,我不太熟悉四捨五入的模式,可以從我腦海中得到答案,現在沒時間研究它。 –

0

根據http://en.wikipedia.org/wiki/IEEE_floating_point IEEE標準,64位浮點數的精度爲52位+1符號位。

這意味着任何需要超過52個有效位的數字會舍入到52個有效位。

在你的情況下,你有53個重要的位,這意味着最後一個被丟棄/舍入/某物。

1

我相信這是因爲您處於默認的IEEE舍入模式"round to even"

也就是說,當在兩個可表示值之間精確地舍入一個值時,選擇的結果是有效位的最後一位爲0。

在這種情況下,由於您失去了一點精度,這相當於「四捨五入到四的倍數」。

因此,值9007199254740995四捨五入爲表示值9007199254740996.0,而不是同樣閉,並且還表示值9007199254740994.0

同時值9007199254740993回合9007199254740992.0,也不9007199254740994.0

相關問題