Fließkommavergleich mit doppelter Genauigkeit

8

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%     
Kiril 14.11.2011, 05:24
quelle

3 Antworten

3

Machen Sie meine Kommentare zu einer Antwort.

Es gibt zwei Dinge, die schief gehen könnten:

  1. 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.

  2. 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.

    
Mysticial 14.11.2011, 05:57
quelle
1

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.

    
Omnifarious 14.11.2011 06:26
quelle
1

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.

    
TonyK 14.11.2011 07:40
quelle