1

次のコードでは、x0==x1およびy0==y1の場合、そのように通知されます。私が使用している例では、それらはそうです。ただし、Pythonは、yではなくxの値が等しいと言っているだけです。

コードは次のとおりです。

print "arc2x0 = ", arc2x0, ", arc2x1 = ", arc2x1
print "arc2y0 = ", arc2y0, ", arc2y1 = ", arc2y1

if arc2x0 == arc2x1:
    print "x0 == x1"
else:
    print "x0 != x1"

if arc2y0 == arc2y1:
    print "y0 == y1"
else:
    print "y0 != y1"

そして、これが出力です:

arc2x0 =  5 , arc2x1 =  5.0
arc2y0 =  -4.16026900507 , arc2y1 =  -4.16026900507
x0 == x1
y0 != y1

y値が同じようにテストされている理由はありますか?これらの値は同じ方法で計算されます。たぶん、私が見ているものを超えて、等しくないより正確なものがありますか?その精度またはこれをデバッグする方法に関する他のアイデアを印刷する方法はありますか?

4

3 に答える 3

5

はい、あなたが見ているものを超えたより正確なものがあります。問題は、==演算子は通常floatでは使用されるべきではないということです。浮動小数点数は精度が制限され、丸め誤差が累積され、すべての10進値を正確に格納できないために不正確になります。例えば

>>> print '%.18f' % 0.1
0.100000000000000006

>>> 0.4 - 0.3 == 0.1
False

フロートが等しいかどうかを比較する最良の方法は、フロートがほぼ等しいかどうかを比較することです。

def nearly_equal(x, y, epsilon=1e-7):
    return abs(x - y) < epsilon

フロート間の差がイプシロン値よりも小さいかどうかを比較することにより、これは、どれだけ近いかが等しいと見なされるかを示します。

これらの問題を回避するために、いつでもdecimal.Decimalタイプを使用できます。

于 2011-03-30T03:03:34.523 に答える
1

ここを参照してください。

于 2011-03-30T02:53:06.913 に答える
1

これは、浮動小数点がどのように機能するかによるものです。手動で数値を切り捨てて、必要な数値に精度を強制する必要があります。

a=-4.16026900507

figures =9
a=round(a*(10**figures))/(10**figures) # truncates the digits
print a

しかし、最善の方法は10進数を使用することだと思います。

from decimal import *
a = Decimal ('your number as a string')
于 2011-03-30T02:59:06.087 に答える