Appendix D. Demi-précision
Comme les nombres à virgule flottante en demi-précision n'ont été ajoutés à IEEE 754 qu'en 2008, les plates-formes de programmation actuelles n'ont souvent encore qu'une prise en charge limitée de ceux-ci. Il est très facile d'inclure au moins la prise en charge du décodage de ces nombres même sans une telle prise en charge. Un exemple de petit décodeur pour les nombres à virgule flottante en demi-précision en langage C est montré dans la Figure 3. Un programme similaire pour Python se trouve dans la Figure 4 ; ce code suppose que la valeur de 2 octets a déjà été décodée comme un entier (unsigned short) dans l'ordre des octets du réseau (comme le ferait le pseudocode de l'Appendix C).
#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;
}
Figure 3 : Code C pour un décodeur en demi-précision
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)
Figure 4 : Code Python pour un décodeur en demi-précision