10

この場合、Pythonが追加の10進数を追加する理由がちょっとわかりません。説明を手伝ってください

>>> mylist = ["list item 1", 2, 3.14]
>>> print mylist ['list item 1', 2, 3.1400000000000001]
4

4 に答える 4

14

浮動小数点数は近似値であり、10 進数を正確に格納することはできません。非常に広い範囲の数値をわずか 64 ビットで表現しようとするため、ある程度近似する必要があります。

いくつかの奇妙な副作用が発生するため、これを認識することは非常に重要です。たとえば、 の 10 ロットの合計は になると非常に合理的に考えるかもしれませ0.11.0。これは論理的に思えますが、浮動小数点に関しては間違っています。

>>> f = 0.0
>>> for _ in range (10):
...  f += 0.1
...
>>> print f == 1.0
False
>>> f
0.99999999999999989
>>> str(f)
1.0

と思うかもしれませんn / m * m == n。繰り返しになりますが、浮動小数点の世界は同意しません。

>>> (1.0 / 103.0) * 103.0
0.99999999999999989

あるいは、同じように不思議なことに、すべてnの人がn + 1 != n. 浮動小数点の土地では、数字は次のようには機能しません。

>>> 10.0**200
9.9999999999999997e+199
>>> 10.0**200 == 10.0**200 + 1
True
# How much do we have to add to 10.0**200 before its 
# floating point representation changes?
>>> 10.0**200 == 10.0**200 + 10.0**183
True
>>> 10.0**200 == 10.0**200 + 10.0**184
False

問題の優れた要約については、「すべてのコンピューター科学者が浮動小数点数について知っておくべきこと」を参照してください。

正確な 10 進数表現が必要な場合は、2.4 以降の Python 標準ライブラリの一部であるdecimalモジュールを確認してください。有効数字の数を指定できます。欠点は、浮動小数点演算がハードウェアで実装されているのに対し、10 進演算は純粋にソフトウェアで行われるため、浮動小数点演算よりもはるかに遅いことです。また、独自の不正確性の問題もありますが、10 進数の正確な表現が必要な場合 (金融アプリケーションなど) には理想的です。

例えば:

>>> 3.14
3.1400000000000001
>>> import decimal
>>> decimal.Decimal('3.14')
>>> print decimal.Decimal('3.14')
3.14
# change the precision:
>>> decimal.getcontext().prec = 6
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.142857')
>>> decimal.getcontext().prec = 28
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1428571428571428571428571429')
于 2010-06-06T22:26:05.807 に答える
6

Python 3.1 には、期待される方法でこれを丸める新しい浮動小数点出力ルーチンがあることに注意してください (Python 2.7 にもバックポートされています)。

Python 3.1 (r31:73572, Aug 15 2009, 17:12:41) 
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [3.14]
>>> print(a)
[3.14]

Python 3.1ドキュメントの新機能から:

Python は現在、David Gay のアルゴリズムを使用して、値を変更しない最短の浮動小数点表現を見つけます。これにより、2 進浮動小数点数に関する混乱がいくらか軽減されます。

重要性は、2 進浮動小数点では正確に同等でない 1.1 のような数値で簡単に確認できます。正確に対応するものはないため、 like のような式は、16 進数または10 進数float('1.1')の最も近い表現可能な値に評価されます。その最も近い値は、その後の浮動小数点計算で使用されていました。0x1.199999999999ap+01.100000000000000088817841970012523233890533447265625

于 2010-06-06T22:47:15.470 に答える
0

前述のように、浮動小数点は近似値です。

正確さが必要な場合は、10 進数を使用できます (これは正確な表現です): http://docs.python.org/library/decimal.html

a = [1.5, 1.49999]
a
[1.5, 1.4999899999999999]

from decimal import Decimal
b = [1.5, Decimal('1.4999')]
b
[1.5, Decimal('1.4999')]
于 2010-06-06T22:30:38.090 に答える