寻找最准确的双数字排序
looking for the most accurate to sort double numbers
我需要对小浮点数进行排序。当我使用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得出相同的浮点值…
- 试图在c++中对数字列表进行排序
- 使用三个数字比较器进行排序
- 我怎么不能按课程代码的降序对数字进行排序
- 合并排序C++帮助 为合并的数字动态分配临时数组
- 修改的选择排序,选择最大的数字,然后交换到最后
- 如何按升序对输入文件中的数字进行排序,并找到它们的范围和中值
- 选择排序以查找未排序数组中的最大数字
- 我想要一个改变数组快速排序的2个数字的函数
- 从(排序的)数字列表中获取数字范围
- C++:按数字排序链表错误
- 如何对忽略某些数字的 std::vector 进行排序?
- 如何对包含数字和符号的字符串进行排序?
- 查看数字是否包含在未排序的双数字间隔内的最有效方法?
- 如何在大型文本文件中对数字进行排序
- 具有前导数字的字符串的排序向量
- 如何在Qt 4.6.2中对QStringList进行数字排序,其中QCollator不可用
- 如何将字符串/数字排序添加到 QSortFilterProxyModel 派生类
- 从 txt 文件读取到矢量中,然后按数字C++排序
- 寻找最准确的双数字排序
- 这是对不同数字排序的更好方法