この減算と加算がこのようにどのように機能するかについて、私は少し混乱しています:
A = 5
B = 0.1
C = A+B-A
そして、答えは 0.099999999999999645 であることがわかりました。答えが 0.1 でないのはなぜですか?
この減算と加算がこのようにどのように機能するかについて、私は少し混乱しています:
A = 5
B = 0.1
C = A+B-A
そして、答えは 0.099999999999999645 であることがわかりました。答えが 0.1 でないのはなぜですか?
これは浮動小数点丸めエラーです。Python の Web サイトには、浮動小数点数に関する非常に優れたチュートリアルがあり、これが何であり、なぜ起こるのかを説明しています。
正確な結果が必要な場合は、次のことができます。
設定した小数点以下の桁数を表示するように結果をフォーマットします (これは丸め誤差を修正しません):
print "%.2f"%C
また、ブライアンの回答から「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」を読むことをお勧めします。
これは、いわゆるイプシロン値によるものです。これは、 からx
までx+E
のすべての浮動小数点数が に等しいと見なされることを意味しx
ます。この値については、Pythonのこの Q&Aで何かを読むことができます。
このイプシロン値 ( E
) は、数値の大きさに依存します。numpy.spacing(x)
コンピュータは「2 進数」を使用して情報を保存します。整数は正確に格納できますが、小数は通常「浮動小数点数」として格納されます。
バイナリ浮動小数点形式では正確に表現できない、基数 10 で簡単に記述できる数値があり、0.1 はそれらの数値の 1 つです。
数値を正確に保存し、数値を正確に操作することができます。たとえば、数値 0.1 は として格納できます1 / 10
。つまり、分子 (1) と分母 (10) として格納できますが、分子は分母で除算されるという理解が必要です。次に、適切に作成された数学ライブラリがこれらの分数を処理し、計算を行います。しかし、浮動小数点数を使用するよりもはるかに遅いため、それほど頻繁には使用されません。(銀行では、通常、浮動小数点の代わりに整数を使用してお金を保管していると思います。1.23 ドルは、暗黙的な小数点以下 2 桁の数値 123 として保管できます。お金を扱う場合、浮動小数点は正確ではありません! )
答えが 0.1 でないのはなぜですか?
浮動小数点数は、その答えを得るのに十分正確ではありません。しかし、聖なる牛はそれが近づいています!
「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」を読むことをお勧めします。
無限の精度を持たない浮動小数点演算のアーティファクトが見られます。FP 数学の仕組みと、丸め誤差が表示される理由の詳細については、この記事を参照してください。