寻找最准确的双数字排序

looking for the most accurate to sort double numbers

本文关键字:数字 排序 寻找      更新时间:2023-10-16

我需要对小浮点数进行排序。当我使用std::sort()//算法库时,我发现在非常非常小的数字的情况下它是不准确的。如何以最准确的方式对该数组进行排序?编辑:我的朋友向我建议了这几行代码,但我不理解它们,它们似乎不适合成对中的第二个项目

bool is_smaller(pair<double,int> a, pair <double , int> b)
{
return (b.first - a.first) > 1e9;
}
sort(a.begin(), a.end(), is_smaller);
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin >> s;
    vector <pair<double,int> > a;
    double x = 0, y = 1, k, d;
    for(int i = 0;i < s.size();i++)
    {
        k = (x + y)/2;
        d = abs(k - y);
        //printf("[%.3lf %0.3lf]  %.3lf %.3lf n",x, y, k, d);
        a.push_back({k,i+1});
        if(s[i] == 'l')
            y = k, x = k - d;
        else
            y = k + d, x = k;
    }
    sort(a.begin(), a.end());
    for (int i =0;i < a.size();i++)
        printf("%dn",a[i].second);

    return 0;
}

输入:代码的输出:1.2.6.7.8.10111314151921232425293233363940424445505253515455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910049484746434138373534313028272622201817161295.4.3

预期输出:1.2.6.7.8.10111314151921232425293233363940424445505253545557616364656769727476777980838485878993949910098979695929190888682817875737170686662605958565149484746434138373534313028272622201817161295.4.3.注释:错误答案第28个数字不同-预期:"54",发现:"51"

浮点运算的精度有限,尽管这种精度在加倍时很高,但仍然有限。

您的算法生成一个数字序列,K(i),其中CCD_ 1。

上面的|差|是一个几何序列,因此它呈指数递减。因此,在ì的某个值时,差异将变得非常小,以至于无法将其报告到浮点表示中。

我用完全相同的输入运行了您的代码,但我也打印了索引的数字,并且我没有应用排序。我打印了最多50位十进制数字(%.50f,只是为了看看!)。我观察到了什么?

位置i > 53的数字都相等(在double可以实现的精度内)。因此,索引在53以上的数字将以某种方式随机排序,因为它们是相等的。

如果您以足够的精度打印浮动:

printf("%03d %.18fn",a[i].second,a[i].first);

然后,您将看到计算结果为秩51到100得出相同的浮点值…