1

この問題を手伝ってくれませんか。

コード:-

import numpy as np

def test(numList):
    yesList=[]
    for num in numList:
        print num, "start here"
        for i in np.arange(2.0,3.0,0.1):
            print i
        if num==i: yesList.append(num)
    return yesList

print test([2.1,2.3,3.0])

出力:-

2.1 start here
2.0
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.3 start here
2.0
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3.0 start here
2.0
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
[2.1]

印刷したいのです[2.1,2.3][2.1]、図のように表示されます。

4

2 に答える 2

3

簡単な答えは、浮動小数点数 (不正確) を使用していて、正確な結果を期待しているため、最終的には失敗するということです。長い答えはもっと複雑ですが、まず、このサイトの浮動小数点に関する FAQ の最初の項目を見てください:浮動小数点演算は壊れていますか? (これは JavaScript に関する質問ですが、すべての言語に等しく当てはまります。)

于 2012-08-13T05:59:04.873 に答える
0

また、Pythonでループ変数がどのようにインクリメントされるかにも依存します...ループの(i + 1)番目の値は次のいずれかです

  value[i] = startValue + i * increment

また

  value[i] = value[i-1] + increment

浮動小数点では、これらの値は異なります...
したがって、厳密な浮動小数点の同等性を扱いたい場合は、この種の詳細を知る必要があります

また、ループがいつ停止するかを制御するのは非常に困難です...最後の値は(3.0-epsilon)になる可能性があります

最初のルールは、言語に関係なく浮動小数点でループを使用しないことです
。代わりに整数を使用します。

def test(numList):
    yesList=[]
    for num in numList:
        print num, "start here"
        for i in np.arange(20,30,1):
            print i*0.1
            if num==(i/10.0): yesList.append(num)
    return yesList

また、float 0.1 は正確には 1/10 ではないため、i*0.1 と i/10.0 が異なる場合があることに注意して
ください。
たとえば、(23*0.1) == (23/10.0) は false であり、最後はたまたま float 2.3 と厳密に等しくなりますが、どちらも数学的分数 23/10 とは異なります。

2 番目のルールは、float で厳密な等価性を使用しないように指示します。

def test(numList):
    yesList=[]
    for num in numList:
        print num, "start here"
        for i in np.arange(20,30,1):
            print i*0.1
            if abs(num-0.1*i) < 0.05 : yesList.append(num)
    return yesList

「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」をお読みください。http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

于 2012-08-13T09:52:52.713 に答える