double
2つ以上の値を比較する最も効率的な方法は何でしょうかfloat
?
単にこれを行うだけでは正しくありません。
bool CompareDoubles1 (double A, double B)
{
return A == B;
}
しかし、次のようなものです:
bool CompareDoubles2 (double A, double B)
{
diff = A - B;
return (diff < EPSILON) && (-diff < EPSILON);
}
処理が無駄になっているようです。
もっと賢い float 比較器を知っている人はいますか?
ベストアンサー1
他の提案を使用する場合は、十分に注意してください。すべては状況によって異なります。
a==b
私は、を前提とするシステムのバグをトレースするのに長い時間を費やしました|a-b|<epsilon
。根本的な問題は次のとおりです。
アルゴリズムにおいて、 の場合
a==b
、b==c
であるという暗黙の推定a==c
。インチで測定された線とミル (.001 インチ) で測定された線に同じイプシロンを使用します。ただし
a==b
、イプシロンまたは最大 ULPS を要求するのは1000a!=1000b
そのためです。AlmostEqual2sComplement
角度のコサインと線の長さの両方に同じイプシロンを使用します。
このような比較関数を使用して、コレクション内の項目を並べ替えます。(この場合、
==
double 用の組み込み C++ 演算子を使用すると、正しい結果が得られます。)
a
先ほど言ったように、すべてはコンテキストとおよびの予想されるサイズによって決まりますb
。
ちなみに、std::numeric_limits<double>::epsilon()
は「マシン イプシロン」です。これは、 double で表現できる次の値との差です1.0
。 比較関数で使用できると思いますが、期待値が 1 未満の場合に限ります。(これは @cdv の回答に対する返答です...)
また、基本的に でint
演算を行う場合doubles
(ここでは、特定のケースで double を使用して int 値を保持します)、演算は正しいものになります。たとえば、 は4.0/2.0
と同じになります1.0+1.0
。これは、分数 ( ) になる操作を実行したり4.0/3.0
、int のサイズを超えたりする操作を実行しない限り当てはまります。