Ich bin hier ein wenig verwirrt - würde der Vergleich von Doppelpunkten immer noch korrekt funktionieren, wenn sie als undurchsichtige (binäre) Felder gespeichert werden? Das Problem, mit dem ich konfrontiert bin, ist die Tatsache, dass das Doppelte ein führendes Bit für das Zeichen enthält (d. H. Positiv oder negativ) und wenn sie als binäre Daten gespeichert werden, bin ich mir nicht sicher, ob es richtig verglichen wird:
Ich möchte sicherstellen, dass der Vergleich korrekt funktioniert, weil ich ein Double als Teil eines Schlüsseltupel (zB) in LevelDB und ich möchte die Datenlokalität für positive und negative Zahlen beibehalten. LevelDB verwendet nur undurchsichtige Felder als Schlüssel, aber es erlaubt dem Benutzer, seinen eigenen Vergleicher zu spezifizieren. Ich möchte jedoch nur sicherstellen, dass ich keinen Komparator vorschlage, es sei denn, ich muss unbedingt:
%Vor%Machen Sie meine Kommentare zu einer Antwort.
Es gibt zwei Dinge, die schief gehen könnten:
Wenn einer der Parameter (oder beide) NAN
ist, geben Vergleiche immer false zurück. Selbst wenn die Binärdarstellung gleich ist, wird NAN == NAN
immer falsch sein. Außerdem verletzt es die Vergleichstransitivität.
Wenn einer der Parameter nicht korrekt ausgerichtet ist (da es sich um Zeichenzeiger handelt), können Probleme auf Computern auftreten, die fehlausgerichteten Speicherzugriff nicht unterstützen. Und für diejenigen, die dies tun, können Sie einen Leistungseinbruch erleben.
Um dieses Problem zu umgehen, müssen Sie einen Trap Case hinzufügen, der aufgerufen wird, wenn einer der Parameter NAN
lautet. (Ich bin mir nicht sicher über den Status von INF
.)
Aufgrund der Notwendigkeit für diesen Trap-Fall müssen Sie Ihren eigenen Vergleichsoperator definieren.
Ja, Sie müssen Ihre eigene Vergleichsfunktion angeben. Dies liegt daran, dass Doppelungen nicht unbedingt als Big-Endian-Werte gespeichert werden. Der Exponent wird sich nicht vor der Mantisse im Speicher befinden, obwohl er logischerweise vor der Mantisse erscheint, wenn der Wert im Big-Endian-Format ausgegeben wird.
Natürlich, wenn Sie Sachen zwischen verschiedenen CPU-Architekturen in der gleichen Datenbank teilen, können Sie sowieso seltsame Endian-Probleme haben, nur weil Sie Sachen als binäre Blobs gespeichert haben.
Zu guter Letzt, selbst wenn du die Kontrolle über Endianess übernehmen könntest, würde ich dir immer noch nicht vertrauen. Wenn zum Beispiel ein Double nicht normalisiert ist, kann es nicht korrekt mit einem anderen Double verglichen werden, wenn es als Binärdaten verglichen wird.
Natürlich ist alles, was die andere Person über die Ausrichtung und ungerade Werte wie NAN und INF gesagt hat, wichtig, um beim Schreiben einer Vergleichsfunktion darauf zu achten. Aber soweit man überhaupt einen schreiben sollte, müsste ich sagen, dass es eine wirklich gute Idee wäre.
Ich nehme an, dass Ihr Zahlenformat dem IEEE 754-Standard entspricht. Wenn das der Fall ist, dann wird ein einfacher vorzeichenbehafteter ganzzahliger Vergleich nicht funktionieren - wenn beide Zahlen negativ sind, wird das Ergebnis des Vergleichs umgekehrt. Sie müssen also Ihren eigenen Komparator angeben.
Tags und Links c++ comparison floating-point double leveldb