对于浮点精度的问题,我为浮点数定义了自定义比较函数:

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需要一个比较器,该比较器定义了严格弱排序。这意味着,除其他外,必须满足以下条件:

  • 我们定义两个项目ab,如果a === b
  • 则等于等效(!cmp(a, b) && !cmp(b, a))
  • 等效性是可传递的:a === b && b === c => a === c

  • 正如您在问题中已经说过的那样,您的函数cmp()不满足这些条件,因此您不能在std::sort()中使用您的函数。不仅算法的结果是不可预测的,这是很糟糕的,除非您实际上正在寻找这种不可预测性(参见randomize):如果您有一些彼此非常接近的值,那么它们中的任何一个都将true与一些,但还有false和其他,则该算法可能会进入无限循环。

    因此,答案是否定的,除非您要冒程序冻结的风险,否则不能在cmp()中使用函数std::sort()

    10-08 08:22
    查看更多