浮動小数点数を比較する方法の違い


7

2つの浮動小数点数が同一であるかどうかを判断する多くのアプローチがあるようです。ここに私が見つけたいくつかの例があります:

  1. fabs(x - y) < n * FLT_EPSILON * fabs(x) または fabs(x - y) < n * FLT_EPSILON * fabs(y)

  2. fabs(x - y) < n * FLT_EPSILON * fabs(x + y)

  3. fabs(x - y) < n * FLT_EPSILON * fabs(x + y) || fabs(x - y) < FLT_MIN)

  4. fabs(x - y) < n * FLT_EPSILON * sqrt(x * x + y * y + FLT_EPSILON * FLT_EPSILON)

私はそれらについて本当に混乱しています。2つの浮動小数点数を比較するための最良の方法があると仮定します。これは、最も単純かつ最も正確であり、他のアプローチは存在すべきではありません。したがって、これらの異なる方法には、それぞれ長所と短所があるはずです。

私の質問は次のとおりです。「実際の計算」を行うには、どのアプローチが最も正確ですか。


参照リンク:

http://accu.org/index.php/journals/1558(1および4)

https://stackoverflow.com/a/10335601/5399734(2および3)


2
残念ながら、数値分析は簡単な問題ではありません。正しい選択は、実行している計算の種類によって異なる場合があります。
Yuval Filmus

回答:


2

これらの答えは互換性のない概念を混合して正しい混乱にするため、当然のことながら混乱しています。

2つの浮動小数点数が等しいかどうかを知りたい場合は、「==」演算子を使用します。これにより、それらが等しいかどうかが正確にわかります。

それらが同一であるかどうかを知りたい場合は、少し注意が必要です。等しいが同一ではない+0と-0があり、等しくない、または等しくないNaN(Not-a-Number)があるですが、同じにすることができます。

ここで、浮動小数点演算を実行すると、同じ数学的な結果を与えるはずの2つの計算が、丸め誤差のために異なる結果をもたらすことがあります。また、異なる数学的結果を与えるはずの2つの計算で同じ結果が得られることもあります。

迅速で簡単なルールはありません。あなたはあなたの目標が何であるか、そしてそれをどのように達成するかについて考える必要があります。そして、すべてのケースが異なります。

PS。(4)ひどいです。完全に、完全に間違っています。倍精度を使用し、x、yのいずれかが10 ^ 160より大きい場合、このコードでは、ほぼすべての2つの数値が「等しい」と見なされます。

PS。(1-3)は0≠0であると主張しているため、同様にひどいです。

PS。(3)ひどい-漸進的なアンダーフローの考えを完全に破壊します。

PS。原則として、特に理由がない限り、単精度ではなく倍精度を使用してください。あなたが説明し、守ることができる理由。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.