Float32 bis Float16

8

Kann mir jemand erklären, wie ich einen 32-Bit Gleitkommawert in einen 16-Bit Gleitkommawert umwandle?

(s = Vorzeichen e = Exponent und m = Mantisse)

Wenn 32-Bit-Float 1s7e24m ist Und 16-Bit-Float ist 1s5e10m

Dann ist es so einfach wie das?

%Vor%

Ich gehe davon aus, dass es nicht so einfach ist ... also kann mir jemand sagen, was Sie tun müssen?

Edit: Ich sehe, dass meine Exponentenverschiebung falsch ist ... also wäre DAS besser?

%Vor%

Ich hoffe, das ist richtig. Entschuldigung, wenn ich etwas Offensichtliches vermisse, das gesagt wurde. Es ist fast Mitternacht an einem Freitagabend ... also bin ich nicht "ganz" nüchtern;)

Edit 2: Hoppla. Buged es wieder. Ich möchte die oberen 3 Bits nicht die niedrigeren verlieren! Wie wäre es damit:

%Vor%

Der endgültige Code sollte lauten:

%Vor%     
Goz 11.06.2010, 21:45
quelle

3 Antworten

4

Die Exponenten in Ihren Darstellungen float32 und float16 sind wahrscheinlich voreingenommen und unterschiedlich voreingenommen. Sie müssen den Exponenten aus der float32-Darstellung freigeben, um den tatsächlichen Exponenten zu erhalten, und ihn dann für die float16-Darstellung vorbelasten.

Abgesehen von diesem Detail denke ich, dass es so einfach ist, aber ich werde immer noch von Gleitkommadarstellungen von Zeit zu Zeit überrascht.

BEARBEITEN:

  1. Überprüfe auf Überlauf, wenn du die Sache mit den Exponenten machst, während du dabei bist.

  2. Ihr Algorithmus schneidet die letzten Bits der Mantisa ein wenig abrupt ab, was vielleicht akzeptabel ist, aber Sie möchten vielleicht sagen, dass Sie auf die nächste Runde gehen, indem Sie die Bits betrachten, die im Begriff sind, verworfen zu werden. "0 ..." - & gt; abrunden, "100.001 ..." - & gt; aufrunden, "100.00" - & gt; rund zu even.

Pascal Cuoq 11.06.2010, 21:53
quelle
4

Hier ist der Link zu einem Artikel über IEEE754, der die Bit-Layouts und -Vorspannungen angibt.

Ссылка

    
bbudge 11.06.2010 21:58
quelle
4

Der Exponent muss unverzerrt, geklammert und revidiert sein. Dies ist der schnelle Code, den ich verwende:

%Vor%

Dieser Code wird noch schneller mit einer Nachschlagetabelle für den Exponenten, aber ich benutze diesen, weil er leicht an einen SIMD-Workflow angepasst werden kann.

Einschränkungen der Implementierung:

  • Überlaufende Werte, die in float16 nicht dargestellt werden können, geben undefinierte Werte zurück.
  • Unterlaufende Werte geben einen nicht definierten Wert zwischen 2^-15 und 2^-14 anstelle von null zurück.
  • Denormals geben undefinierte Werte.

Seien Sie vorsichtig mit Denormalen. Wenn Ihre Architektur sie verwendet, können sie Ihr Programm erheblich verlangsamen.

    
sam hocevar 07.04.2011 21:38
quelle

Tags und Links