2

しばらくグーグルで調べた後、助けを求めてここに投稿しています。

関数から返された 2 つの float64 変数があります。どちらも明らかに 1 です。

>>> x, y = somefunc()
>>> print x,y
>>> if x < 1 :   print "x < 1"
>>> if y < 1 :   print "y < 1"
1.0  1.0
y < 1

変数が float32 で定義されている場合、動作が変わります。この場合、'y<1' ステートメントは表示されません。

設定してみた

np.set_printoptions(precision=10)

変数間の違いが見られることを期待していますが、それでも、印刷すると両方とも 1.0 として表示されます。

この時点で少し混乱しています。これらの float64 数値の違いを視覚化する方法はありますか? 「if/then」を確実に使用して float64 の数値をチェックできますか?

ありがとうトレバレス

4

3 に答える 3

4

印刷された値が正しくありません。あなたの場合、 を使用する場合yよりも小さく、を使用する場合と同じかそれ以上です。丸め誤差は のサイズに依存するため、これは予期されることです。1float641float32float

この種の問題を回避するために、浮動小数点数を扱うときは、常に「最小誤差」を決定する必要があります。これは通常epsilon、等値を比較する代わりに、結果がepsilon目標値から最大で離れているかどうかを確認するために呼び出されます。

In [13]: epsilon = 1e-11

In [14]: number = np.float64(1) - 1e-16

In [15]: target = 1

In [16]: abs(number - target) < epsilon   # instead of number == target
Out[16]: True

特に、特定の許容誤差が与えられた場合に配列が等しいかどうかを比較するのに便利な which はnumpyすでに提供されています。np.allclose引数が配列でない場合でも機能します(例np.allclose(1 - 1e-16, 1) -> True)。

ただし、/の印刷numpy.set_printoptions方法には影響しないことに注意してください。配列の印刷方法にのみ影響します。np.float3264

In [1]: import numpy as np

In [2]: np.float(1) - 1e-16
Out[2]: 0.9999999999999999

In [3]: np.array([1 - 1e-16])
Out[3]: array([ 1.])

In [4]: np.set_printoptions(precision=16)

In [5]: np.array([1 - 1e-16])
Out[5]: array([ 0.9999999999999999])

In [6]: np.float(1) - 1e-16
Out[6]: 0.9999999999999999

また、対話型インタープリターで実行print yまたは評価すると、異なる結果が得られることに注意してください。y

In [1]: import numpy as np

In [2]: np.float(1) - 1e-16
Out[2]: 0.9999999999999999

In [3]: print(np.float64(1) - 1e-16)
1.0

違いは、print呼び出しstrを評価しながら呼び出すことreprです:

In [9]: str(np.float64(1) - 1e-16)
Out[9]: '1.0'

In [10]: repr(np.float64(1) - 1e-16)
Out[10]: '0.99999999999999989'
于 2013-08-19T11:14:54.690 に答える
1
In [26]: x  = numpy.float64("1.000000000000001")

In [27]: print x, repr(x)
1.0 1.0000000000000011

つまり、printステートメントの精度の低下に悩まされています。値は とはわずかに異なり1ます。

于 2013-08-19T10:06:25.977 に答える
0

ここで提供されているアドバイスに従って、答えを次のように要約します。

float 間の比較を行うには、プログラマーは、それらが異なると見なされる最小距離 (eps) を定義する必要があります (たとえば、eps=1e-12)。そうすることで、条件は次のように記述されます。

Instead of (x>a), use (x-a)>eps
Instead of (x<a), use (a-x)>eps
Instead of (x==a), use abs(x-a)<eps

整数間の差は 1 に固定されるため、これは整数間の比較には適用されません。

それが私を助けたように、それが他の人を助けることを願っています。

于 2013-08-20T08:49:06.290 に答える