ダブルスでかなり奇妙な問題に遭遇しました。降順でソートされた浮動小数点数(double)のリストがあります。しかし、私のプログラムの後半で、それらが正確にソートされていないことに気付きました。例えば:
0.65801139819
0.6545651031 <-- a
0.65456513001 <-- b
0.64422968678
真ん中の2つの数字が反転しています。この問題は数字の表現にあると思われるかもしれませんが、それらは単に間違って印刷されています。ただし、並べ替えに使用したのと同じ演算子を使用して、各数値を前の数値と比較します。基数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();
}
そして、それらが常に2倍になり、floatに変換されないようにしました。Pt()
ダブルを返します。リストにはNaNがなく、ソート後にリストに触れません。
なぜこれなのか、これらの番号の何が問題なのか、そして(どのように)番号を並べ替えて並べ替えたままにすることができますか?