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%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:
Überprüfe auf Überlauf, wenn du die Sache mit den Exponenten machst, während du dabei bist.
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.
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:
2^-15
und 2^-14
anstelle von null zurück. Seien Sie vorsichtig mit Denormalen. Wenn Ihre Architektur sie verwendet, können sie Ihr Programm erheblich verlangsamen.
Tags und Links c floating-point