[英]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
>>>
分配給x
和y
的文字僅在一個非常低的有效位上有所不同-您可能需要滾動才能看到它-而x
和y
具有不同的值。 顯然,如果Python基於15個十進制數字被截斷,情況就不會如此。
取而代之的是,它選擇最接近十進制文字的IEEE 64位二進制浮點數,並且將四舍五入為帶有最低有效小數位為零的位。 我選擇y
恰好介於兩個可表示數字之間,但四舍五入。 x
只是稍大一點,因此將其取整。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.