0

次のような python コードがあります。

import sys
import fileinput, string
K = 3
f = raw_input("please input the initial "+str(K)+" lamba: ").split()

Z = []
sumoflamba = 0.0
for m in f:
    j = m.find("/")
    if j!=-1:
            e=float(m[:j])/float(m[j+1:])
    else:
            e = float(m)
    sumoflamba+=e
    if e==0:
            print "the initial lamba cannot be zero!"
            sys.exit()
    Z.append(e)
print sumoflamba
if sumoflamba!=1:
    print "initial lamba must be summed to 1!"
    sys.exit()

0.7、0.2、0.1で実行すると。警告を出力して終了します。ただし、0.1、0.2、0.7 で実行すると。それは正常に動作します。0.3、0.3、0.4 でも問題なく動作します。手がかりがありません....誰かがこれを説明できますか?「print sumoflamda」は、これらすべてのケースで 1.0 を返します。

4

3 に答える 3

5

Lattywareが提供したリンクが説明していることのほとんどは説明していますが、一言で言えば、精度について明示しないと、等値比較が浮動小数点で機能することは期待できません。値を四捨五入するか、整数にキャストすると、予測可能な結果が得られます

>>> f1 = 0.7 + 0.2 + 0.1
>>> f2 = 0.1 + 0.2 + 0.7
>>> f1 == f2
False
>>> round(f1,2) == round(f2,2)
True
于 2013-02-18T01:27:03.957 に答える
0

フロートは不正確です。それらを操作すればするほど、不正確さが蓄積されます。一部の数値は正確に表現できますが、ほとんどの数値は表現できません。それらを同等に比較することは、ほとんどの場合間違いです。

于 2013-02-18T01:17:54.260 に答える
0

浮動小数点数が等しいかどうかをチェックするのは悪い習慣です。ここでできる最善のことは、番号が目的の範囲内にあることを確認することです. 浮動小数点の仕組みの詳細については、http://en.wikipedia.org/wiki/Floating_point#Internal_representationを参照してください。

于 2013-02-18T01:18:38.040 に答える