Was macht dieser Code?

7
%Vor%

Ich bin gerade dabei, mit der Chipmunk-Physik-Engine anzufangen und fand diese in einer Header-Datei

INFINITY wird verwendet, um unendlichen Impuls für Objekte zu setzen, aber ich verstehe nicht, was dieser Code oben tut!

    
Ham 04.11.2010, 10:20
quelle

4 Antworten

15

Er setzt INFINITY auf den Float-Wert, der durch die Hex-Bits 0x7f800000 repräsentiert wird, der +INF ist. Visual Studio definiert INFINITY aus irgendeinem Grund nicht.

    
Jim Buck 04.11.2010 10:25
quelle
6

Der obige Code definiert effektiv eine Gleitkommakonstante mit einigen sehr spezifischen Bytes.

Jedes float wird mit einer Menge von Bytes dargestellt, aber wenn Sie float Konstanten definieren, müssen Sie die Dezimalzahl verwenden und keine Konstante mit dem Wert say 0xFFFFFFFF definieren (weiß nicht) wenn diese Konstante eine legale float -Nummer ist).

Der obige Code umgeht diese Einschränkung - er setzt zunächst ein Byte-Array innerhalb der Union und "greift" dann auf dasselbe Byte-Array zu, als wäre es eine float -Nummer. Dies ist übrigens illegal - nur das vorher gesetzte Gewerkschaftsmitglied kann legal angesprochen werden, aber es könnte bei dieser spezifischen Implementierung funktionieren.

    
sharptooth 04.11.2010 10:23
quelle
2

Erzeugt eine Variable INFINITY_HACK vom Typ MSVC_EVIL_FLOAT_HACK. Es setzt das Byte-Array auf Werte der jeweiligen Hex-Werte. Es konvertiert dann diese Bytes in eine Fließkommazahl (union erlaubt es nur, einen der zugrundeliegenden Werte zu verwenden, indem es referenziert. Value konvertiert die Daten, auf die INIFITY_HACK zeigt, float), indem es dem IEEE-754 Fließkomma-Standard (beachten Sie, dass die Bytes in umgekehrter Reihenfolge genommen werden) für binäre- & gt; float-Konvertierung.

Es gibt einen netten kleinen Rechner, der es erklären kann, wenn Sie nicht wissen, wie es funktioniert: Ссылка (Wenn Sie 7F800000 eingeben, erhalten Sie Infinity, aber geben Sie 4048F5C2 ein ( Sie werden in die Nähe von 3.14 kommen) Dieser Rechner wird dezimal- & gt; hex.

    
pinkfloydx33 04.11.2010 10:48
quelle
1

Es ist eine Möglichkeit, den von einer float-Variablen belegten Speicher auf 0x7f800000 zu initialisieren. Wie @Jim sagt, ist dies + unendlich im Float.

Der Code entspricht in etwa:

%Vor%

Zunächst definiert der ursprüngliche Code eine Union, die es Ihnen ermöglicht, vier Byte Speicher entweder als ein Array von vier Bytes oder als ein einzelnes Float (von dem wir annehmen, dass es ebenfalls vier Bytes belegt) zu bearbeiten:

%Vor%

Dann weist es eine Instanz der Union namens INFINITY_HACK zu und setzt die Werte seines Arrays Bytes auf die angegebenen Hex-Werte.:

%Vor%

Dadurch wird das float-Wertfeld initialisiert, da es auch den gleichen Speicher belegt wie das Byte-Array.

Schließlich definiert es eine Pro-Prozessor-Konstante namens INFINITY als Float-Wert.

    
Andy Johnson 04.11.2010 10:47
quelle

Tags und Links