IEE 754 Gesamtauftrag in Standard C ++ 11

8

Laut IEEE Gleitkomma Wikipage (auf IEEE 754) gibt es eine Gesamtbestellung auf Gleitkommazahlen mit doppelter Genauigkeit (dh auf C ++ 11 Implementierungen mit IEEE-754 Floats, wie gcc 4.8 unter Linux / x86-64).

Natürlich liefert operator < auf double oft eine Gesamtbestellung, aber NaN sind bekanntlich Ausnahmen (es ist bekannt, dass x != x eine Testmöglichkeit ist, wenn x , als% deklariert ist co_de% ist ein NaN).

Der Grund, warum ich frage, ist, dass ich eine haben möchte. double x; (eigentlich eine Menge von JSON-like -oder Python like- Werten) und ich möchte, dass die Menge eine kanonische Darstellung hat (meine praktische Sorge ist die Ausgabe von portablen JSON-gleichen Daten, geordnet in der gleichen Reihenfolge, beides auf Linux / x86-64 und zB auf Linux / ARM, sogar in seltsamen Fällen wie NaN).

Ich kann keinen einfachen Weg finden, um diese totale Ordnung zu bekommen. Ich habe

codiert %Vor%

Eigentlich weiß ich, dass es sich nicht um eine (mathematisch gesprochene) Gesamtordnung handelt (Da zum Beispiel bitweise verschiedene NaN gleich sind), aber ich hoffe, es hat das gleiche (oder ein sehr nahes) Verhalten auf mehreren gemeinsamen Architekturen.

Irgendwelche Kommentare oder Vorschläge?

(vielleicht sollte mir das nicht so wichtig sein; und ich interessiere mich bewusst nicht für Signalisierungs-NaNs )

>

Die allgemeine Motivation ist, dass ich einen dynamisch typisierten Interpreter codiere, der seinen gesamten Speicherzustand in JSON-Notation behält, und ich möchte sicher sein, dass der persistente Zustand zwischen Architekturen stabil ist, mit anderen Worten, wenn ich den JSON Zustand und dump es, bleibt es idempotent für mehrere Architekturen (vor allem alle x86-64, ia-32, ARM 32 Bits ...).

    
Basile Starynkevitch 20.11.2013, 13:33
quelle

1 Antwort

6

Ich würde verwenden:

%Vor%

Dies macht 0.0 und -0.0 ungleich, während if (x==y) return 0; in Ihrer Version Gleiches ergibt, was bedeutet, dass Ihre Version nur eine Vorbestellung ist. NaN -Werte liegen über dem Rest und verschiedene NaNs vergleichen sich. Alle Werte, die für <= vergleichbar sind, sollten für die obige Beziehung in derselben Reihenfolge sein.

Hinweis: Die obige Funktion ist C. Ich kenne C ++ nicht.

    
Pascal Cuoq 22.11.2013, 21:23
quelle

Tags und Links