PDA

Visualizza la versione completa : floating point


roberto81
25-02-2010, 16:53
ragazzi scusate io vorrei saper come si fa a convertire in binario floating piont a 32 bit tramite lo standard IEEE quello che ho capito è che devo prima trasformare
il numero es: 12,50 in binario quindi


12/2=6 r:0
6/2=3 r:0
3/2=1,5 r:1
1/2=0,5 r:1

12=1100

0,50*2=1 1
quindi 12,50=1100.1
dopo la codifica in binario lo standard usa
s=segno m=mentissa b=basa e=esponente
e so che sono riservati un bit per il segno 8 per l'esponente 23 la mantissa
dopo come si procede.........?HELP!

YuYevon
26-02-2010, 18:21
Devi innanzituttto "normalizzare" il numero, cioè scriverlo in maniera tale da avere solo una cifra binaria a sinistra della virgola e tutte le altre a destra. Se in decimale un numero come 145.6 è uguale a 1.456 x 10^2, in binario il numero 1100.1 è uguale a 1.1001 x 2^3.

Fatto questo, sappiamo che lo standard IEEE 754 riserva 23 bit per la mantissa (24 con l'hidden bit). Visto che 1.1001 ne ha solo 5, dobbiamo aggiungerci gli altri 24-5 = 19, quindi il numero diventerà

1.10010000000000000000000

dove 1 prima della virgola può essere omesso (la forma normalizzata sottintende a 1 la parte prima della virgola, quindi è inutile memorizzarla).

Tutto questo però è moltiplicato per 2^3, quindi l'esponente del numero sarà 3. Visto che il suddetto standard prevede di rappresentare l'esponente in "eccesso k" (rappresentazione "biased", dove k vale 127 per la singola precisione e 1023 per la doppia), allora devvi appunto sommare 127 a 3 e ottieni 130. L'esponente sarà quindi 130, che in BCD (su 8 bit) è

10000010

In conclusione, il tuo numero è positivo quindi avrò 0 come bit segno (1 se fosse stato negativo). In definitiva il numero dovrebbe essere

0 10000010 10010000000000000000000

In doppia precisione il ragionamento è praticamente lo stesso, solo che i bit della mantissa dovranno essere 56 eequelli dell'esponente 11 (e l'eccesso 1023 anziché 127).

Ho comunque fatto una verifica con una semplice utility in C che scrissi quando anch'io mi cimentavo con queste cose (se vuoi usarla anche tu per verificare -> http://sprunge.us/CAgG?c - dovrebbe funzionare correttamente) e ottengo lo stesso risultato :)

Loading