Anhang D. Halbe Genauigkeit
Da Gleitkommazahlen mit halber Genauigkeit erst 2008 in IEEE 754 aufgenommen wurden, haben heutige Programmierplattformen oft immer noch nur eingeschränkte Unterstützung dafür. Es ist sehr einfach, zumindest die Dekodierungsunterstützung dafür einzubauen, selbst ohne eine solche Unterstützung. In Abbildung 3 ist ein Beispiel für einen kleinen Decoder für Gleitkommazahlen mit halber Genauigkeit in der Sprache C dargestellt. Ein ähnliches Programm für Python findet sich in Abbildung 4; dieser Code setzt voraus, dass der 2-Byte-Wert bereits als (unsigned short) ganze Zahl in Netzwerk-Byte-Reihenfolge dekodiert wurde (wie es der Pseudocode in Anhang C tun würde).
#include <math.h>
double decode_half(unsigned char *halfp) {
int half = (halfp[0] << 8) + halfp[1];
int exp = (half >> 10) & 0x1f;
int mant = half & 0x3ff;
double val;
if (exp == 0) val = ldexp(mant, -24);
else if (exp != 31) val = ldexp(mant + 1024, exp - 25);
else val = mant == 0 ? INFINITY : NAN;
return half & 0x8000 ? -val : val;
}
Abbildung 3: C-Code für einen Decoder mit halber Genauigkeit
import struct
from math import ldexp
def decode_single(single):
return struct.unpack("!f", struct.pack("!I", single))[0]
def decode_half(half):
valu = (half & 0x7fff) << 13 | (half & 0x8000) << 16
if ((half & 0x7c00) != 0x7c00):
return ldexp(decode_single(valu), 112)
return decode_single(valu | 0x7f800000)
Abbildung 4: Python-Code für einen Decoder mit halber Genauigkeit