0

入力xが1.6と1.9の範囲内にあるかどうかを判断するために、次のことを試しました。

def function(x)    
    if(x >= 1.6 & x <= 1.9):
        return True
    else
        return False

ここでの問題は、1.6または1.9に非常に近い数値を入力すると、これが正しく機能しないことです。たとえば、1.59999999999999999999999は1.6と評価されるため、関数は範囲(1.6〜1.9)になくてもTrueを返します。私は他のいくつかの方法を試しましたが、この丸めの問題を回避することはできません。

誰かがこれを行う方法を考えることができますか?

4

2 に答える 2

3

floatPython で値を使用する場合、数値を完全に正確に比較することはできません。これは、浮動小数点値の精度が本質的に制限されているためです。

あなたの例では、数値は(コメントでnneonneoが述べたように)1.5999999999999999999999と同じ浮動小数点表現になります。1.6さらに驚くべきことは、浮動小数点表現がどちらのソース数値とも正確に等しくないことです (小数点以下 20 桁までは です1.60000000000000008882)。1.6Python はこれを少し隠します。数値を出力すると、数値が少し大きくなっても表示されるからです。

最後の余分なビットは丸め誤差です。これは、1.6 の反復しないバイナリ表現がないためです。3 分の 1 が無限に繰り返される 10 進数でしか正確に表現できないよう1.6に、2 進数で正確に表現するには無限のビット数が必要です。エラーは、特定の桁数の後に表現を停止し、残りを丸めることから発生します ( として表現1/30.333333、繰り返される 3 の残りを切り捨てるなど)。

浮動小数点エラーの影響を軽減するコードを作成する方法はいくつかありますが、非常に高い精度が必要な状況で浮動小数点値を使用しないことを除いて、浮動小数点エラーを完全になくすことはできません。 . Python では、(ある程度のパフォーマンスを犠牲にして) 精度を上げたい場合は、代わりに標準ライブラリの Decimal クラスを使用できます。

from decimal import Decimal

d1 = Decimal("1.5999999999999999999999")
d2 = Decimal("1.6")

print(d1 >= d2) # prints: False
于 2012-09-26T06:14:54.867 に答える
0

これは、すべての言語で float 型を扱う場合の一般的な問題です。マシン上の Python で使用されている float の精度を本当に知りたい場合は、http://docs.python.org/library/sys.html#sys.float_infosys.float_info.epsilonを参照してください。私の場合、次のように表示されます。

Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16
于 2012-09-26T07:03:40.097 に答える