2014-02-19 24 views
-1

試過109221975 * 123222821乘法在Python 2.7的提示兩種不同的方式不同的結果在Python上VS浮動

Python 2.7.3 (default, Sep 26 2013, 20:08:41) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 109221975*123222821 
13458639874691475L 
>>> 109221975*123222821.0 
1.3458639874691476e+16 
>>> int(109221975.0*123222821.0) 
13458639874691476L 
>>> 109221975*123222821 == int(109221975.0*123222821.0) 
False 
>>> 

相同的數字作爲整數相乘什麼,我懷疑這裏有一些精度不一致是造成這樣的問題,是否有可能推測何時會出現這種不一致?

+1

http://docs.python.org/2/tutorial/floatingpoint。 html – dm03514

+3

感嘆。另一天,另一個FP混淆。請參閱[什麼每臺計算機科學家應該知道關於浮點運算(http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – dawg

+1

應該有一個警告你後,如果之前float在您的問題文本中的任何位置首先閱讀該文章。 – IanAuld

回答

1

曾幾何時,有一個名爲st的字符串,該字符串想成爲一個數字。我應該說什麼號碼st?

字符串的仙神的母親說:好了ST,如果你想成爲一個準確的數字,一些用於計算整個事情,我會是一個任意精度的整數

>>> st='123456789123456789' 
>>> int(st) 
123456789123456789 
>>> int(st)*int(st)*int(st) 
1881676377434183981909562699940347954480361860897069 

「但我也想去計算局部的東西,比如我還有的三明治的一半!說聖。所以,漂浮媽媽說漂亮的教母,但知道一段時間後你可能會丟失幾個1/2三明治。事實上,經過9007199254740992事情,你可能會開始忘記一些,因爲你只有53周的手指時,你是一個浮球來算:

>>> float(int('1'*53,2)+1) 
9007199254740992.0 
>>> float(int('1'*53,2)+1)+1 
9007199254740992.0 

>>> int(float(int(st))) 
123456789123456784 
>>> int(st)-int(float(st)) 
5 
1

因爲int在Python有無限的精度,但float沒有。 (float是一個雙精度浮點數,具有53位精度。)

2

您的int是54位長。 float可以保存53位有效數字,所以有效的最後一位數被四捨五入爲偶數。

2225720309975242 * 2 -1

intfloat以二進制格式如下所示::

   101111110100001000111111001000111001000001000110010011 
0 10000110100 0111111010000100011111100100011100100000100011001010 

內部,爲您的浮點表示對於float,第一部分是符號,第二個是指數,並且第三個是有效數。因爲空間分配給一個指數,沒有足夠的空間留下了顯著數字

如何排列的兩個聲明,你可以看到的數據是一樣的,但int需要在正確的額外的數字,而float在左側使用更多(在這種情況下浪費)空間

+0

對於那些好奇的人,我使用'struct.unpack('Q',struct.pack('d',number))提取浮點數的二進制數' – mhlester

相關問題