对于浮点精度的问题,我为浮点数定义了自定义比较函数:
bool cmp(double a, double b)
{
if(abs(a - b) <= eps) return false;
return a < b;
}
然后,我对一些浮点数数组进行排序。我听说有些比较功能不好会导致排序错误。我只是想知道
cmp
是否可以正确进行排序?一方面,cmp
满足关联规则。但另一方面,cmp(x - eps, x) == false
&& cmp(x, x + eps) == false
并不意味着cmp(x - eps, x + eps) == false
。我没有直接在浮点数上使用sort,因为我想排序的是
pair<double, double>
。例如:
(1,2), (2,1), (2.000000001, 0)
我想将2和2.000000001视为相同,并期望结果为:
(1,2), (2.000000001, 0), (2,1)
最佳答案
std::sort
需要一个比较器,该比较器定义了严格弱排序。这意味着,除其他外,必须满足以下条件:
a
和b
,如果a === b
!cmp(a, b) && !cmp(b, a)
)a === b
&& b === c
=> a === c
正如您在问题中已经说过的那样,您的函数
cmp()
不满足这些条件,因此您不能在std::sort()
中使用您的函数。不仅算法的结果是不可预测的,这是很糟糕的,除非您实际上正在寻找这种不可预测性(参见randomize
):如果您有一些彼此非常接近的值,那么它们中的任何一个都将true
与一些,但还有false
和其他,则该算法可能会进入无限循环。因此,答案是否定的,除非您要冒程序冻结的风险,否则不能在
cmp()
中使用函数std::sort()
。