簡體   English   中英

Python浮點數比較

[英]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.36.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.06.6不同,因為它有意義? 不,這只是因為乘法中的舍入誤差。

它工作的一個例子是5.5*2.0 == 2.2*5.0 == 11.0 四舍五入是有利的

暫無
暫無

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

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