2011-09-25 23 views
12

可能性の重複:
How is floating point stored? When does it matter?誰かがこれを説明できますか?0.2 + 0.1 = 0.30000000000000004?

がなぜ次のPythonインタプリタで発生するのでしょうか?

>>> 0.1+0.1+0.1-0.3 
5.551115123125783e-17 
>>> 0.1+0.1 
0.2 
>>> 0.2+0.1 
0.30000000000000004 
>>> 0.3-0.3 
0.0 
>>> 0.2+0.1 
0.30000000000000004 
>>> 

なぜ0.2 + 0.1 = 0.3ですか?

+3

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html – Johnsyweb

+1

http://docs.python.org/tutorial/floatingpoint.html –

答えて

9

これは、.1を2進浮動小数点表現で正確に表すことができないためです。あなたは

>>> .1 

しようとした場合、それが唯一の特定の精度まで印刷しますので、Pythonは.1で応答しますが、小さな丸め誤差がすでにあります。同じことが.3で発生していますが、その後、.2.1累積で丸め誤差を

>>> .2 + .1 
0.30000000000000004 

を発行するとき。また、注:

>>> .2 + .1 == .3 
False 
+0

いずれも0.1です。 –

+0

@ MarkByers:良い点、私の答えを広げた。 –

+2

および0.2 ;-) 3のいずれも、(-1)^ sign * 1.fraction * 2 ^(exp-127)で参照することはできません。http://en.wikipedia.org/wiki/IEEE_754-1985を参照してください。受け入れられた回答http://stackoverflow.com/questions/56947/how-is-floating-point-stored-when-does-it-matter/57031#57031重複のあるソースhttp://stackoverflow.com/questions/56947/how-is-floating-point-stored-when-does-it-matter-matter-matter-of-matterは –

7

すべての浮動小数点数が有限のマシンで正確に表現できるわけではありません。バイナリ浮動小数点では、0.1と0.2のどちらも正確に表現できません。そして0.3もまたありません。

a/bの形式でaとbが整数でbが2の累乗である場合、数値は正確に表現できます。明らかに、データ型には数を格納するのに十分な大きさが必要です。

私はRob Kennedy's useful webpageを表現力を探索する良いツールとしてお勧めします。

関連する問題