簡體   English   中英

了解浮點文檔

[英]Understanding Floating-point doc

我正在閱讀有關浮點數問題和限制的Python文檔。

在頁面的大約一半處顯示:

有趣的是,有許多不同的十進制數字共享相同的最接近的近似二進制分數。 例如,數字0.1和0.10000000000000001和0.10000000000000000555111512312578270211815834045410102525均由3602879701896397/2 ** 55近似。由於所有這些十進制值都具有相同的近似值,因此可以顯示其中任何一個,同時仍保留不變的eval(repr(x)) == x

特別要說的是:

由於所有這些十進制值都具有相同的近似值,因此可以顯示其中任何一個,同時仍保留不變的eval(repr(x)) == x

Python不會用超過15個十進制數字截斷float嗎? 有什么例子嗎?

關鍵是無論最初提供多少個額外的數字,您對於repr()輸出都是相同的,

>>> repr(0.1)
'0.1'
>>> repr(0.1000000000000000055511151231257827021181583404541015625)
'0.1'

那么,為什么不為兩者都打印更長的版本呢?

# Hypothetically...
>>> repr(0.1)
'0.1000000000000000055511151231257827021181583404541015625'
>>> repr(0.1000000000000000055511151231257827021181583404541015625)
'0.1000000000000000055511151231257827021181583404541015625'

因此,有多種方法可以打印出相同的數字。 Python使用dtoa()函數來選擇最短的方法來打印出給定的數字,在這種情況下,最短的方法是0.1

0.1實際上並不精確:確切的結果是較長的結果,但是dtoa()在打印輸出時將數字四舍五入,只要在讀回時四舍五入的數字將被四舍五入為原始數字。也就是說,

float(repr(x)) == x

...即使float()repr()圍繞它們的參數。

除了Dietrich Epp的出色答案外,該答案還專門解決了“ Python不會用超過15個十進制數字截斷float嗎?有沒有示例?”的問題。

考慮以下Python會話:

$ python
Python 2.7.5 (default, Oct  2 2013, 22:34:09) 
[GCC 4.8.1] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 0.10000000000000001249000902703301107976585626602172851562500000000000000000000000000000000000000000000001
>>> x
0.10000000000000002
>>> y = 0.10000000000000001249000902703301107976585626602172851562500000000000000000000000000000000000000000000000
>>> y
0.1
>>> 

分配給xy的文字僅在一個非常低的有效位上有所不同-您可能需要滾動才能看到它-而xy具有不同的值。 顯然,如果Python基於15個十進制數字被截斷,情況就不會如此。

取而代之的是,它選擇最接近十進制文字的IEEE 64位二進制浮點數,並且將四舍五入為帶有最低有效小數位為零的位。 我選擇y恰好介於兩個可表示數字之間,但四舍五入。 x只是稍大一點,因此將其取整。

暫無
暫無

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

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