浮動精度の問題については、浮動小数点数のカスタム比較関数を定義しました。
bool cmp(double a, double b)
{
if(abs(a - b) <= eps) return false;
return a < b;
}
次に、浮動小数点数の配列に対して sort を呼び出します。不適切な比較関数が原因で、並べ替えがセグメント エラーになると聞いたことがあります。cmp
ソートで正しく機能するのだろうか?一方でcmp
は、関連付けルールを満たしています。しかし一方でcmp(x - eps, x) == false
&&cmp(x, x + eps) == false
は という意味ではありませんcmp(x - eps, x + eps) == false
。
ソートしたいのはpair<double, double>
. 例えば:
(1,2), (2,1), (2.000000001, 0)
2 と 2.000000001 を同じと見なし、結果が次のようになることを期待したいと思います。
(1,2), (2.000000001, 0), (2,1)