Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 寻找对双精度数字进行排序的最精确方法_C++_Sorting_Floating Point - Fatal编程技术网

C++ 寻找对双精度数字进行排序的最精确方法

C++ 寻找对双精度数字进行排序的最精确方法,c++,sorting,floating-point,C++,Sorting,Floating Point,我需要对小浮点数进行排序。 当我使用std::sort()//算法库时, 我发现它在非常小的数字情况下是不准确的。 如何以最精确的方式对该数组进行排序? 编辑:我的朋友向我建议了这几行代码,我不理解它们,而且它们似乎不能正确地处理成对的第二项 bool is_smaller(pair<double,int> a, pair <double , int> b) { return (b.first - a.first) > 1e9; } sort(a.begin(),

我需要对小浮点数进行排序。 当我使用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("%d\n",a[i].second);


    return 0;
}
bool较小(a对、b对)
{
返回(b.优先-a.优先)>1e9;
}
排序(a.begin()、a.end()较小);
#包括
使用名称空间std;
int main()
{
字符串s;
cin>>s;
载体a;
双x=0,y=1,k,d;
对于(int i=0;i
输入:rrlllrrlrrrrrrllrlrrrrrlrlrlrrllrrlrrlrrrlrllrrrrrrrlrlrlrlrlrlrlrlrlrrrrrrrrrlrlrlrlrrrrrlrlrlrlrlrrllllrlrl 代码的输出: 1. 2. 6. 7. 8. 10 11 13 14 15 19 21 23 24 25 29 32 33 36 39 40 42 44 45 50 52 53 51 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 49 48 47 46 43 41 38 37 35 34 31 30 28 27 26 22 20 18 17 16 12 9 5. 4. 三,

预期产出: 1. 2. 6. 7. 8. 10 11 13 14 15 19 21 23 24 25 29 32 33 36 39 40 42 44 45 50 52 53 54 55 57 61 63 64 65 67 69 72 74 76 77 79 80 83 84 85 87 89 93 94 99 100 98 97 96 95 92 91 90 88 86 82 81 78 75 73 71 70 68 66 62 60 59 58 56 51 49 48 47 46 43 41 38 37 35 34 31 30 28 27 26 22 20 18 17 16 12 9 5. 4. 3.
注释:错误答案第28个数字不同-如果以足够的精度打印浮点数,则预期为“54”,发现为“51”:

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

然后,您将看到,计算会导致秩51到100的浮点值相同…

浮点运算的精度有限,尽管此精度很高,但它仍然有限

该算法生成一个数字序列K(i),其中
| K(i+1)-K(i)|=2^(-i)

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

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


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

你能发布你的代码吗?我认为你真正的问题是你的数字不“准确”,而不是试图找到一种“更准确”的排序方法(因为不会有)。你能发布相关的代码吗?这些数字是二进制表示的还是只需按最小浮点步长向上/向下舍入?@我发布了上面的代码。你怎么会认为这不能准确排序?发布您的输入、实际输出和预期输出,以及您期望该输出的原因。然后,数字的处理方式存在问题,除非问题在于两个足够接近的不同分数被四舍五入到相同(最接近的)浮点值……不,这是问题所在。那么,您的问题可能更多的是没有听取建议。请参阅A.S.H.更详细的答案,再考虑一下,或者在调试器中一步一步地执行您的程序,以便更好地理解。恐怕我不知道如何使用调试器,直到索引1到53之间的比较是正确的,并且当我>53时,它被随机排序,这似乎是一个严重的问题。有什么简单的处理方法吗?请参阅我对主要帖子的上一次编辑,因为只要我们使用IEEE754标准进行双精度运算(这就是
double
的意思,使用64位表示法),我们就无法在这个应用程序中做得更好。如果你想要更高的精度,你需要更多的位,因此你必须找到一个提供更宽的浮点数的库。我一直使用的经验法则是,浮点(IEEE-754 4字节)大约有7个有效的十进制数字,而双精度大约有15个。@JontrantVein多一点,也许是18个。但打印这么多十进制数字的目的是为了避免这种计算,并专注于观察精度问题。