chy*_*hyx 2 c++ sorting floating-point
对于浮点精度的问题,我为浮点数定义了自定义比较函数:
bool cmp(double a, double b)
{
if(abs(a - b) <= eps) return false;
return a < b;
}
Run Code Online (Sandbox Code Playgroud)
然后我在一些浮点数上调用sort.我听说一些不好的比较函数会导致排序错误.我只是想知道它能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)
Run Code Online (Sandbox Code Playgroud)
我想将2和2.000000001视为相同,并期望结果如下:
(1,2), (2.000000001, 0), (2,1)
Run Code Online (Sandbox Code Playgroud)
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()除非你想冒风险程序冻结.