[英]Python floating point number comparison
我只是回顧一些Python的基礎知識,並且在比較浮點數方面存在一個棘手的問題。
2.2 * 3.0 == 6.6
3.3 * 2.0 == 6.6
我以為這些都應該返回False。 然而,第二個給了我一個真實。
請幫幫我。 謝謝!
這可能很有啟發性:
>>> float.hex(2.2 * 3.0)
'0x1.a666666666667p+2'
>>> float.hex(3.3 * 2.0)
'0x1.a666666666666p+2'
>>> float.hex(6.6)
'0x1.a666666666666p+2'
雖然它們都以十進制顯示為6.6
,但是當您檢查內部表示時,其中兩個以相同的方式表示,而其中一個不是。
為了完成Amadan的好答案,這里有一個更明顯的方式來看2.2 * 3。 和3.3 * 2。 不是由相同的float表示:在Python shell中,
>>> 2.2 * 3.
6.6000000000000005
>>> 3.3 * 2.
6.6
事實上,Python shell顯示數字的表示 ,根據定義,它應該允許從表示中正確地構建相應的float,因此您可以看到Python所做的2.2 * 3的數值近似。 2.2 * 3的事實。 != 3.3 * 2。 在看到所有必要的數字時很明顯,如上所述。
很明顯, 3.3 * 2.0
在數值上與6.6
相同。 后一種計算只不過是二進制指數的增量,因為它是乘以2的冪的結果。 你可以在下面看到這個:
| s exponent significant
----+-------------------------------------------------------------------
1.1 | 0 01111111111 0001100110011001100110011001100110011001100110011010
2.2 | 0 10000000000 0001100110011001100110011001100110011001100110011010
3.3 | 0 10000000000 1010011001100110011001100110011001100110011001100110
6.6 | 0 10000000001 1010011001100110011001100110011001100110011001100110
上面你看到浮點數3.3
和6.6
的二進制表示。 這兩個數字的唯一區別是指數,因為它們只乘以2。 我們知道IEEE-754會:
2^53
所有整數(對於binary64) 因此,由於2.0
是完全可表示的,因此與該數字相乘只不過是指數的變化。 所以以下所有內容都將創建相同的浮點數:
6.6 == 0.825 * 16.0 == 1.65 * 4.0 == 3.3*2.0 == 13.2 * 0.5 == ...
這是否意味着2.2*3.0
與6.6
不同,因為它有意義? 不,這只是因為乘法中的舍入誤差。
它工作的一個例子是5.5*2.0 == 2.2*5.0 == 11.0
。 四舍五入是有利的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.