回覆列表
  • 1 # 使用者2815752269142

    這不是Python的問題,而是實數的無限精度跟計算機的有限記憶體之間的矛盾。舉個例子,假如說我只能使用整數(即只精確到個位,計算機內的浮點數也只有有限精度,以C語言中的雙精度浮點數double為例,精度為52個二進位制位),要表示任意實數(無限精度)的時候我就只能透過舍入(rounding)來近似表示。比如1.2我會表示成1,2.4表示成2,3.6表示成4.所以呢?在算1.2 - 1.2的時候,由於計算機表示的問題,我算的實際上是1 - 1,結果是0,碰巧蒙對了;在算1.2 + 1.2 - 2.4的時候,由於計算機表示的問題,我算的實際上是1 + 1 - 2,結果是0,再次蒙對了;但是在算1.2 + 1.2 + 1.2 - 3.6的時候,由於計算機表示的問題,我算的實際上是1 + 1 + 1 - 4,結果是-1,運氣沒那麼好啦!這裡的1.2, 2.4, 3.6就相當於你問題裡的0.1, 0.2和0.3,1, 2, 4則是真正在計算機內部進行運算的數值,我說清楚了嗎?其他請看IEEE 754浮點數標準,比如CSAPP第二章啥的(雖然估計你沒興趣看)。另:不僅僅是浮點數的在計算機內部的表示有誤差,運算本身也可能會有誤差。比如整數2可以在計算機內準確表示,但是要算根號2就有誤差了;再比如兩個浮點數相除,本來兩個數都是精確表示的,但除的結果精度卻超出了計算機內實數的表示範圍,然後就有誤差了。

  • 2 # 使用者5295278951632

    再計算機的硬體中,浮點數以二進位制小數表示。比如小數

    [python] view plain copy

    0.125

    可看做1/10+2/100+5/1000,同樣的方式二進位制小數

    [python] view plain copy

    0.001 可看做0/2+0/4+1/8。

    這兩個小數實際的值是相同的,唯一的不同是0.125是十進位制表示,0.001是二進位制表示。可是不幸的是,多數的十進位制小數不能用二進位制小數準確的表示。通常,你輸入的十進位制浮點數只能由儲存在機器中的二進位制浮點數近似表示。無論你使用多少位二進位制數字,十進位制的0.1都不能準確的由二進位制小數表示,其是無限重複的小數

    [python] view plain copy

    0.0001100110011001100110011001100110011001100110011...

    在一個執行python的典型計算機中,一個浮點數具有53位的精度,所以十進位制的0.1在內部會以如下形式儲存

    [python] view plain copy

    0.00011001100110011001100110011001100110011001100110011010

    實際中,我們很容易忘記儲存的資料是原始十進位制的的近似表示。Python只會顯示出以二進位制形式儲存再計算機中的真正十進位制數的近似數。如

    [python] view plain copy

    0.1000000000000000055511151231257827021181583404541015625

    其中的多數位數都不會被人使用到,所以python只顯示它的四捨五入後的值

    [python] view plain copy

    0.1

    在實際中有很多這樣的例子可以說明:

    [python] view plain copy

    >>> 0.1 + 0.2

    0.30000000000000004

    [python] view plain copy

    >>> round(2.675, 2)

    2.67

    可以使用decimal模組,可以看到準確的浮點數的值。

    [python] view plain copy

    >>> from decimal import Decimal

    >>> Decimal(2.675)

    Decimal("2.67499999999999982236431605997495353221893310546875")

  • 中秋節和大豐收的關聯?
  • 阿聯酋請求美國直接參戰對付葉門胡塞武裝,美國有可能捲入葉門戰事嗎?