一般に、2 つの float を abs(f1-f2) < 1e-6 のように比較する必要があることはわかっていますが、比較する前に丸めた場合、Python で丸めた値を比較しても安全ですか?
if round(f1,5)==round(f2,5):
print "equal"
else
print "unequal"
ありがとう
一般に、2 つの float を abs(f1-f2) < 1e-6 のように比較する必要があることはわかっていますが、比較する前に丸めた場合、Python で丸めた値を比較しても安全ですか?
if round(f1,5)==round(f2,5):
print "equal"
else
print "unequal"
ありがとう
まず、あなたが提案するように、2つのフロートを許容誤差で比較する必要はありません。2つの浮動小数点数の関係は、それらがどのように導出されたかによって異なり、アプリケーションによって大きく異なります。これに対する統一された答えはありません。
次に、2つの丸められた値の等式比較は、値が等しい場合にのみtrueを返します。あらゆる種類の許容誤差が「ほぼ等しい」関数を取得できるようにしても、効果はありません(許容誤差が丸め距離よりも小さい場合)。
ただし、小さなエラーによって値が丸めポイントの一方の側からもう一方の側に移動する可能性があるため、浮動小数点の値の丸めには問題があります。たとえばf1
、最も近い整数への丸めを検討してください。ここで、f1
は、丸め誤差を含む浮動小数点演算で計算した値です。(丸め誤差は、演算の数学的な結果が正確に表現できない場合に発生するため、コンピューターはそれを最も近い表現可能な結果に丸める必要があります。)たとえばf1
2.5に非常に近い場合、何に丸めるべきですか?明らかに、2.5未満の場合は2に丸められ、大きい場合は3に丸められます。ただし、f1
正確な数学で計算されたの理想値が2.5をわずかに超えると仮定しますが、計算値は次のようになります。丸め誤差のため、2.5よりわずかに少ない。それでf1
2に丸めますが、3に丸めることをお勧めします。
同時に、f2
正しく3に丸められるものがあるとします。丸められたものと丸めf1
られたものを比較するf2
と、それらは等しくありません。
したがって、数値を四捨五入した後は、それらにどのようなエラーがあったのかを考えるには遅すぎます。その情報はなくなっています。四捨五入した後の数値を比較しても、四捨五入前に正確な数学的結果が互いに近かったかどうかはわかりません。
これに対する解決策は、特定のアプリケーションと数値の計算方法によって異なります。一般的な解決策はありません。
いいえ。ドキュメンテーションで述べたように、
float に対する round() の動作は驚くべきものです。たとえば、round(2.675, 2) は、予想される 2.68 ではなく 2.67 を返します。
したがって、答えは依然として浮動小数点数であり、その正確な値について保証することはできません。
round()
浮動小数点数として正確に表すことができない数値を返す例があり、結果は適切な比較のためにイプシロンを使用する必要があります (たとえば、Python の round() は適切に丸められていないようです)。