Frage

Ich tue etwas Gleitkomma-Arithmetik und Präzision Probleme. Der resultierende Wert ist unterschiedlich auf zwei Maschinen für den gleichen Eingang. Ich las die post @ Warum kann ich nicht mehrfach ein Schwimmer? und auch lesen sie anderes Material auf der Bahn und zu verstehen, dass es wird mit binärer Darstellung von Gleitkomma- und auf Maschine epsilon zu tun. Allerdings wollte ich überprüfen, ob es einen Weg gibt, dieses Problem / Einige Arbeit um für Gleitkomma-Arithmetik in C ++ zu lösen ?? Ich bin ein Schwimmer unsigned short zur Speicherung Umwandlung und zurück bin Umwandlung, wenn notwendig. Allerdings, wenn ich es zurück zu unsigned short konvertieren, die Genauigkeit (bis 6 Dezimalstellen) bleibt korrekt auf einer Maschine, aber nicht auf der anderen Seite.

//convert FLOAT to short

unsigned short sConst = 0xFFFF;

unsigned short shortValue = (unsigned short)(floatValue * sConst);

//Convert SHORT to FLOAT

float floatValue = ((float)shortValue / sConst);
War es hilfreich?

Lösung

A short muss mindestens 16 Bit betragen, und in einer ganzen Menge von Implementierungen, die genau das, was es ist. Ein unsigned 16-Bit-short werden Werte von 0 bis 65535. Das bedeutet halten, dass eine kurze nicht volle fünf Ziffern der Präzision halten, und schon gar nicht sechs. Wenn Sie sechs Ziffern möchten, müssen Sie 20 Bits.

Daher ist der Verlust an Präzision der Tatsache, wahrscheinlich auf Grund, dass Sie versuchen, sechs Ziffern der Präzision weniger in etwas zu packen als fünf Ziffern. Es gibt keine Lösung für dieses Problem, andere als einen integralen Typ mit, dass wahrscheinlich als float so viel Speicher braucht.

Ich weiß nicht, warum es an der Arbeit an einem bestimmten System scheinen würde. Sind Sie die gleichen Zahlen auf beiden verwenden? Hat man ein älteres Floating-Point-System, und eine, die zufällig die Ergebnisse gab man an den Proben erwartet haben Sie versucht? War es vielleicht eine größere short als die anderen mit?

Andere Tipps

Wenn Sie native Fließkommatypen verwenden wollen, das Beste, was Sie tun behaupten kann, dass die ausgegebenen Werte von Ihrem Programm unterscheiden sich nicht zu viel von einem Satz von Referenzwerten.

Die genaue Definition von „zu viel“ hängt ganz von Ihrer Anwendung. Zum Beispiel, wenn Sie a + b auf verschiedenen Plattformen berechnen, sollten Sie die beiden Ergebnisse finden in Maschinengenauigkeit voneinander sein. Auf der anderen Seite, wenn Sie etwas kompliziert wie Matrixinvertierung tun, werden die Ergebnisse wahrscheinlich um mehr als Maschinengenauigkeit. genau festzulegen, wie nah können Sie die Ergebnisse miteinander zu erwarten ist ein sehr subtiler und komplizierter Prozess. Es sei denn, Sie wissen genau, was Sie tun, ist es wahrscheinlich sicherer (und vernünftigere) die Menge an Präzision zu bestimmen, die Sie in Ihrer Anwendung Downstream benötigen und stellen Sie sicher, dass das Ergebnis hinreichend genau ist.

Um eine Vorstellung zu bekommen, wie die relativen Fehler zwischen zwei Fließkommawert zu berechnen, robust, sehen Sie diese Antwort und die Gleitkomma-Führung verknüpfen darin:

Gleitkomma-Vergleichsfunktionen für C #

Anstelle der Verwendung von 0xFFFF Gebrauch der Hälfte davon, das heißt 32.768 für die Konvertierung. 32768 (Ox8000) eine binäre Darstellung von 1000000000000000 während OxFFFF eine binäre Darstellung 1111111111111111. Ox8000 ‚s binäre Darstellung, Multiplikation und Divsion Operationen während der Umwandlung deutlich impliziert hat (zu kurz (oder), während zurück zu float Umwandlung) nicht präzise Werte ändern nach Null. Für eine Seite Umwandlung ist jedoch OxFFFF vorzuziehen, da es zu einer genaueren Ergebnis führt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top