Gibt es moderne Plattformen mit Nicht-IEEE C / C ++ Float-Formaten?

8

Ich schreibe ein Videospiel, Humm and Strumm , das eine Netzwerkkomponente in seiner Spielengine benötigt. Ich kann leicht mit Unterschieden in der Endianz umgehen, aber ich habe versucht, mit möglichen float Speicherformaten umzugehen. Ich weiß, dass moderne Computer alle ein ganzzahliges Standardformat haben, aber ich habe gehört, dass sie nicht alle den IEEE-Standard für Gleitkomma-Ganzzahlen verwenden. Ist das wahr?

Während ich es natürlich nur als Zeichenfolge in jedes Paket ausgeben könnte, müsste ich trotzdem in ein "bekanntes Format" jedes Clients konvertieren, unabhängig von der Plattform. Der Standard printf() und atod() wäre nicht ausreichend.

Bitte beachten Sie, da dieses Spiel ein Free / Open Source Softwareprogramm ist, das unter GNU / Linux, * BSD und Microsoft Windows läuft, kann ich keine proprietären Lösungen oder Einzelplatzlösungen verwenden.

Prost,
Patrick

    
Patrick Niedzielski 27.04.2010, 19:27
quelle

3 Antworten

4

Ich denke, man kann davon ausgehen, dass jede Plattform eine Implementierung der IEE-754-Spezifikation besitzt, auf die man sich verlassen kann. Aber selbst wenn sie alle dieselbe Spezifikation implementieren, gibt es keine Garantie dafür, dass jede Plattform dieselbe Implementierung hat , hat die gleichen FP-Steuerflags gesetzt, führt dieselben Optimierungen durch oder implementiert dieselben nicht standardmäßigen Erweiterungen. Dies macht es schwierig, den Gleitkommadeterminismus zu kontrollieren und etwas unzuverlässig für diese Art von Sache zu verwenden (wo Sie FP-Werte über das Netzwerk mitteilen werden).

Weitere Informationen dazu; lies Ссылка

Ein weiteres Problem ist die Behandlung von Clients, die keine Fließkommaeinheit haben. Meistens handelt es sich um Low-End-CPUs, Konsolen oder Embedded-Geräte. Achten Sie darauf, dies zu berücksichtigen, wenn Sie sie als Ziel haben möchten. FP Emulation kann getan werden, aber neigt dazu, auf diesen Geräten sehr langsam zu sein, so dass Sie einen Hang von Fixpunktberechnungen bekommen müssen. Seien Sie jedoch darauf aufmerksam, dass das Verfassen ausgefeilter Klassen, um Fließkomma- und Fixpunktberechnungen zu simulieren, zu demselben Code wie ein Plan klingt; aber auf den meisten Geräten nicht. Es erlaubt Ihnen nicht, die maximale Genauigkeit und Leistung herauszufordern, wenn Sie mit Fixpunktwerten arbeiten.

Ein weiteres Problem besteht darin, die Endiannität der Gleitkommawerte zu behandeln, weil Sie nicht einfach Bytes austauschen und m in einem Fließkommaregister wieder stapeln können (die Bytes erhalten möglicherweise eine andere Bedeutung, siehe Ссылка dazu).

Mein Rat wäre, die Floats in Fixpunkt-Zwischenwerte zu konvertieren, bei Bedarf eine Endian-Korrektur vorzunehmen und diese zu übertragen. Nehmen Sie außerdem nicht an, dass zwei Gleitkommaberechnungen auf verschiedenen Computern zu denselben Ergebnissen führen. sie nicht. Andere Gleitkommaimplementierungen als IEEE-754 sind jedoch selten. Zum Beispiel neigten Grafikprozessoren dazu, Fixpunkte zu verwenden, haben aber heutzutage eher eine Untergruppe von IEEE-754, weil sie sich nicht mit Division-durch-Null-Ausnahmen befassen wollen, aber sie werden Erweiterungen für Halb-Floats haben, die hineinpassen 16 Bits.

Stellen Sie außerdem fest, dass es Bibliotheken gibt, die dieses Problem bereits gelöst haben (Senden von Low-Level-Datenformaten in einem Spielkontext) für Sie. Eine solche Bibliothek ist RakNet, speziell die BitStream-Klasse ist dafür ausgelegt, diese Arten von Daten zuverlässig an verschiedene Plattformen zu senden, während der Aufwand auf ein Minimum beschränkt bleibt. zum Beispiel durchläuft RakNet einige Schwierigkeiten, beim Senden von Strings oder Vektoren keine Bandbreite zu verschwenden.

    
Jasper Bekkers 27.04.2010, 20:07
quelle
6

Wenn Sie Ihre Netzwerkschnittstelle richtig abstrahieren, können Sie Funktionen / Objekte verwenden, die die Float-Datentypen serialisieren und deserialisieren. Bei jedem System, das mir einfällt, handelt es sich um den IEEE-Standard. Sie sollten die Daten also unverändert weitergeben (der Compiler wird es wahrscheinlich sogar optimieren, so dass Sie keine Performance verlieren). Wenn Sie auf ein System mit einem anderen Format stoßen, können Sie Code in diesen Funktionen bedingt kompilieren, um Bit-Hacks auszuführen, um vom IEEE-Standard in das native Format zu konvertieren. Sie müssen es nur an einer Stelle ändern. Sie werden dies wahrscheinlich nie tun müssen, es sei denn, Sie kommen in Konsolen / Handhelds / etc.

    
rmeador 27.04.2010 19:44
quelle
1

Einige eingebettete Prozessoren enthalten überhaupt keine Fließkomma-Hardware. Für Desktop - Computer sehe ich keinen Grund, sich zu sehr Sorgen zu machen, abgesehen von Details, die Spezialisten nur wirklich nerven ( sqrt werden auf dem Alpha falsch gerundet, so etwas. Die Unterschiede, die sie verärgern, sind in der Implementierung des Operationen, nicht des Formats, sowieso).

Eine Variation zwischen Plattformen hängt mit der Handhabung von Denormalen zusammen. Ich habe vor einer Weile eine Frage zu denen gestellt . Auch das war nicht so schlimm, wie ich es erwartet hatte.

    
Pascal Cuoq 27.04.2010 19:43
quelle