Passa al contenuto principale

Appendice D. Metà precisione

Poiché i numeri in virgola mobile a metà precisione sono stati aggiunti allo standard IEEE 754 solo nel 2008, le piattaforme di programmazione odierne spesso ne hanno ancora un supporto limitato. È molto facile includere almeno il supporto per la loro decodifica anche in assenza di tale supporto. Nella Figura 3 è mostrato un esempio di un piccolo decoder per numeri in virgola mobile a metà precisione nel linguaggio C. Nella Figura 4 si trova un programma simile per Python; questo codice presuppone che il valore di 2 byte sia già stato decodificato come un intero (unsigned short) in ordine di byte di rete (come verrebbe fatto dallo pseudocodice nell'Appendice 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;
}

Figura 3: Codice C per un decoder a metà precisione

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)

Figura 4: Codice Python per un decoder a metà precisione