Speichern von Ints als Floats

8

Angenommen, ich verfüge über eine API, die es mir erlaubt, Floats oder Float-Arrays zu speichern. Allerdings möchte ich hier ganzzahlige Werte speichern.

Ich verstehe (ungefähr), dass ich mit einem Straight Cast bis zu 2 ^ 23 okay bin, aber was ist, wenn ich höher gehen will? Gibt es eine Möglichkeit, dass ich mehr von den 32 Bits eines Floats ausnutzen kann und sicher sein werde, dass ich dieselbe Nummer zurückbekomme?

Zur Klarstellung:

Ich mache einige Operationen auf Punktwolken mit Pixars PRMan (dh RenderMan). Ich kann in C oder C ++ schreiben, indem ich mit der vorkompilierten Punktwolken-API verlinke. PRMan muss zu keinem Zeitpunkt diese Ints verwenden, die ich speichere; Ich brauche es nur, um es mir intakt zu übergeben, nachdem ich andere Daten an den Punkten bearbeitet habe.

    
Mike Boers 10.11.2010, 23:06
quelle

3 Antworten

8

Fragwürdig:

In C können Sie Folgendes tun, was möglicherweise unsicher ist (aufgrund von Regeln für das strikte Aliasing):

%Vor%

und die auf der Annahme beruht, dass sizeof(int) == sizeof(float) .

Weniger fraglich:

Sicherer, aber langwieriger ist Folgendes:

%Vor%

Dies beruht immer noch auf übereinstimmenden Datentypgrößen. Beide der oben genannten Annahmen machen jedoch die Annahme, dass die Interna der von Ihnen verwendeten Bibliothek die Daten überhaupt nicht übernehmen. Zum Beispiel wird es keine spezielle Behandlung für NaN oder +/- Unendlichkeit usw. haben.

Sicher:

Entlang einem völlig anderen Gedankengang, wenn Sie glücklich sind, zwei Schwimmer pro int zu verschwenden, könnten Sie etwas tun wie:

%Vor%

Dieser letzte ist sicher (abgesehen von einigen ziemlich vernünftigen Annahmen über die Größe von Floats und Ints).

    
Oliver Charlesworth 10.11.2010, 23:13
quelle
3

Im Mantissenfeld können Sie 23 Bits speichern. Mit dem Exponentenfeld können Sie fast 8 Bit speichern, es ist 8 Bit breit und einige Werte sind reserviert. Und es gibt ein Vorzeichen.

Wenn Sie die reservierten Werte im Exponenten vermeiden, können Sie immer noch 31 Bits Ihrer Wahl speichern.

Sie können frexp und ldexp nützlich finden.

    
Ben Voigt 11.11.2010 00:10
quelle
0

Alle hier angegebenen Antworten setzen voraus, dass Sie nur die für den Float-Speicher reservierten Bytes als Speicherstelle für einen int verwenden möchten. Sie werden Ihnen nicht erlauben, Arithmetik für die int-encoded-in-float-Werte auszuführen. Wenn Sie wollen, dass Arithmetik funktioniert, stecken Sie mit 24.99 Bits fest (dh einem Bereich von - (2 ^ 24-1) bis (2 ^ 24-1); ich halte das Vorzeichenbit für 0.99 Bits anstatt für 1 Bit, weil Sie kann den niedrigstmöglichen Wert nicht mit der Vorzeichen- / Betragsdarstellung von float speichern) und eine dünne Menge größerer Werte (z. B. ist jedes beliebige 32-Bit-Ganzzahlvielfache von 256 in float darstellbar).

    
R.. 11.11.2010 00:32
quelle

Tags und Links