Я столкнулся с довольно странной проблемой с удвоениями. У меня есть список чисел с плавающей запятой (double), которые сортируются в порядке убывания. Позже в моей программе я обнаружил, что они больше не сортируются. Например:Сортировка/сравнение удвоений в C (++) нестабильна?
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, и я не трогаю список после сортировки.
Почему это, что не так с этими числами, и (как) я могу сортировать числа, чтобы они оставались отсортированными?
AFAIK, 'float' почти всегда 32 байт, тогда как' double' - 64 байта на обеих архитектурах. – Constantinius
Спасибо, это было то, что я предполагал. Так что, по крайней мере, это, вероятно, не так ... – jdm
Может быть, это неправильная сортировка? Что вы используете для сортировки? –