我遇到了一个非常奇怪的双打问题。我有一个按降序排序的浮点数(双精度)列表。后来在我的程序中,我发现它们不再完全排序。例如:
0.65801139819
0.6545651031 <-- a
0.65456513001 <-- b
0.64422968678
中间的两个数字颠倒过来。有人可能会认为这个问题在于数字的表示,它们只是打印错误。但是我使用我用来对它们进行排序的相同运算符将每个数字与前一个数字进行比较 - 没有转换为基数 10 或类似的情况:
double last_pt = 0;
for (int i = 0; i < npoints; i++) {
if (last_pt && last_pt < track[i]->Pt()) {
cout << "ERROR: new value " << track[i]->Pt()
<< " is higher than previous value " << last_pt << endl;
}
last_pt = track[i]->Pt();
}
在排序期间比较这些值
bool moreThan(const Track& a, const Track& b) {
return a.Pt() > b.Pt();
}
我确保它们总是双倍的,而不是转换为浮点数。Pt()
返回一个双倍。列表中没有NaN,排序后我没有触摸列表。
为什么会这样,这些数字有什么问题,以及(如何)我可以对数字进行排序以使它们保持排序状态?