Negli esempi che seguono supponiamo 1 bit segno, 8 bit parte intera, 7 bit parte frazionaria.
14:2=7 R=0 0 7:2=3 R=1 1 3:2=1 R=1 2 1:2=0 R=1 3e poi la parte frazionaria: 0,2510=0,012 (riempio il resto della parte frazionaria con 0).
0,25*2=0,5 U=0 -1 0,5 *2=1,0 U=1 -2 0 (termino conversione perché ho incontrato 0)Risultato(valore assoluto): 14,2510 = 1110,012
Negli esempi che seguono supponiamo 1 bit segno, 8 bit parte intera, 7 bit parte frazionaria.
14:2=7 R=0 0 7:2=3 R=1 1 3:2=1 R=1 2 1:2=0 R=1 3e poi la parte frazionaria: 0,2510=0,012 (riempio il resto della parte frazionaria con 0).
0,25*2=0,5 U=0 -1 0,5 *2=1,0 U=1 -2 0 (termino conversione perché ho incontrato 0)Risultato(valore assoluto): 14,2510 = 1110,012
14:2=7 R=0 0 7:2=3 R=1 1 3:2=1 R=1 2 1:2=0 R=1 3e poi la parte frazionaria: 0,2510=0,012 (riempio il resto della parte frazionaria con 0).
0,25*2=0,5 U=0 -1 0,5 *2=1,0 U=1 -2 0 (termino conversione perché ho incontrato 0)Risultato(valore assoluto): 1110,012
14:2=7 R=0 0 7:2=3 R=1 1 3:2=1 R=1 2 1:2=0 R=1 3e poi la parte frazionaria: 0,210=0,00112 (tutte le cifre dopo la virgola costituiscono il periodo).
0,2 *2=0,4 U=0 -1 0,4 *2=0,8 U=0 -2 0,8 *2=1,6 U=1 -3 0,6 *2=1,2 U=1 -4 0,2 (termino conversione perché ho già incontrato questo numero)Risultato(valore assoluto): 1110,00112
14:2=7 R=0 0 7:2=3 R=1 1 3:2=1 R=1 2 1:2=0 R=1 3e poi la parte frazionaria: 0,310 = 0,010012 (il primo zero dopo la virgola costituisce l'antiperiodo, le cifre rimanenti costituiscono il periodo).
0,3 *2=0,6 U=0 -1 0,6 *2=1,2 U=1 -2 0,2 *2=0,4 U=0 -3 0,4 *2=0,8 U=0 -4 0,8 *2=1,6 U=1 -5 0,6 (termino conversione perché ho già incontrato questo numero)Risultato(valore assoluto): 1110,010012
14:2=7 R=0 0 7:2=3 R=1 1 3:2=1 R=1 2 1:2=0 R=1 3e poi la parte frazionaria: 0,3310 = 0,01010100011110102.
0,33*2=0,66 U=0 -1 0,66*2=1,32 U=1 -2 0,32*2=0,64 U=0 -3 0,64*2=1,28 U=1 -4 0,28*2=0,56 U=0 -5 0,56*2=1,12 U=1 -6 0,12*2=0,24 U=0 -7 0,24*2=0,48 U=0 -8 0,48*2=0,96 U=0 -9 0,96*2=1,92 U=1 -10 0,92*2=1,84 U=1 -11 0,84*2=1,68 U=1 -12 0,68*2=1,36 U=1 -13 0,36*2=0,72 U=0 -14 0,72*2=1,44 U=1 -15 0,44*2=0,88 U=0 -16 0,88 ... (termino conversione perché sono finiti i bit disponibili per la parte frazionaria)Risultato(valore assoluto): 1110,01010100011110102
0,88*2=1,76 U=1 -17 0,76*2=1,52 U=1 -18 0,52*2=1,04 U=1 -19 0,04*2=0,08 U=0 -20 0,08*2=0,16 U=0 -21 0,16*2=0,32 U=0 -22 0,32 (termino conversione perché ho già incontrato questo numero)Risultato(valore assoluto): 1110,01010100011110101110002
Perché alcuni numeri limitati in base 10 diventano periodici in base 2? Vedi Numeri periodici e frazione generatrice.
Esistono diversi modi per rappresentare numeri in virgola mobile, ma il sistema più utilizzato è lo standard IEEE-P754; questo metodo comporta l'utilizzo della notazione scientifica, in cui ogni numero è identificato dal segno, da una mantissa (1,xxxxx) e dall'esponente (nyyyyy).
La procedura standard per la conversione da numero decimale a numero binario P754 è la seguente:
Convertire in floating point IEEE-754 il numero -14,312510.
Escludo temporaneamente il segno e converto (in binario) prima la parte intera: 1410 = 11102
14:2=7 R=0 0 7:2=3 R=1 1 3:2=1 R=1 2 1:2=0 R=1 3e poi converto (in binario) la parte frazionaria: 0,312510 = 0,01012.
0,3125*2=0,625 U=0 0,625 *2=1,25 U=1 0,25 *2=0,5 U=0 0,5 *2=1 U=1 0 (termino conversione perché ho incontrato 0)Risultato(valore assoluto): 1110,01012
Ora normalizzo il numero, spostando la virgola di 3 posizioni verso sinistra: 1110,01012 = 1,11001012 * 23.
Una volta eliminato l'hidden bit, la mantissa diventa quindi 1100101, mentre l'esponente è 3.
Completo la mantissa con zeri fino ad arrivare ai 23 bit a mia disposizione.
Esprimo l'esponente in eccesso 127: 127 + 3 = 13010 = 100000102
Mettendo ad 1 il bit di segno (in quanto siamo partiti da un numero negativo) e completando con zeri la mantissa, risulta quindi:
-14.312510=1 10000010 11001010000000000000000P754/singleCompleto la mantissa con zeri fino ad arrivare ai 10 bit a mia disposizione.
Esprimo l'esponente in eccesso 15: 15 + 3 = 1810 = 100102
Mettendo ad 1 il bit di segno (in quanto siamo partita da un numero negativo) e completando con zeri la mantissa, risulta quindi:
-14.312510=1 10010 1100101000P754/halfConvertire in floating point IEEE-754 il numero -5,82812510.
Escludo temporaneamente il segno e converto (in binario) prima la parte intera:
5:2=2 R=1 0 2:2=1 R=0 1 1:2=0 R=1 2510 = 1012
e poi converto (in binario) la parte frazionaria:
0,828125*2=1,65625 U=1 -1 0,65625 *2=1,3125 U=1 -2 0,3125 *2=0,625 U=0 -3 0,625 *2=1,25 U=1 -4 0,25 *2=0,5 U=0 -5 0,5 *2=1 U=1 -60,82812510 = 0,1101012 Risultato(valore assoluto): 101,1101012
Ora normalizzo il numero, spostando la virgola due posizioni verso sinistra:
1,01110101*22Una volta eliminato l'hidden bit, la mantissa diventa quindi 01110101, mentre l'esponente è 2.
Esprimo l'esponente in eccesso 127 (sommando 2 al bias):
127+2=129Trasformiamo questo numero in binario:
129:2=64 R=1 0 64:2=32 R=0 1 32:2=16 R=0 2 16:2= 8 R=0 3 8:2= 4 R=0 4 4:2= 2 R=0 5 2:2= 1 R=0 6 1:2= 0 R=1 712910=100000012
Mettendo ad 1 il bit del segno in quanto siamo partiti da un numero negativo, e completando con zeri la mantissa, risulta quindi:
-5,82812510=1 1000 0001 0111 0101 0000 0000 0000 000P754/singleEsprimo l'esponente in eccesso 15 (sommando 2 al bias):
15+2=17Trasformiamo questo numero in binario:
17:2= 8 R=1 0 8:2= 4 R=0 1 4:2= 2 R=0 2 2:2= 1 R=0 3 1:2= 0 R=1 4
Mettendo ad 1 il bit del segno in quanto siamo partiti da un numero negativo, e di completando con zeri la mantissa, risulta quindi:
-5,82812510=1 10 001 0111 0101 00P754/half| Esempio1 | Esempio2 | Esempio3 | Esempio4 | Esempio5 | |
|---|---|---|---|---|---|
| Numero da convertire | -49.526 (single prec) | 625.00137 (single prec) | 3.14 (half prec) | 2.99E+3 (half prec) | 8.85E-3 (half prec) |
parte intera 49|1 0 24|0 1 12|0 2 6|0 3 3|1 4 1|1 5 0 parte frazion. 0.526|1 -1 0.052|0 -2 0.104|0 -3 0.208|0 -4 0.416|0 -5 0.832…………… ………………………… |
parte intera 625|1 0 312|0 1 156|0 2 78|0 3 39|1 4 19|1 5 9|1 6 4|0 7 2|0 8 1|1 9 0 parte frazion. 0.00137|0 -1 0.00274…………… ……………………………… |
parte intera 3|1 0 1|1 1 0 parte frazion. 0.14|0 -1 0.28|0 -2 0.56|1 -3 0.12|0 -4 0.24|0 -5 0.48|0 -6 0.96|1 -7 0.92|1 -8 0.84|1 -9 0.68 |
parte intera 2990|0 0 1495|1 1 747|1 2 373|1 3 186|0 4 93|1 5 46|0 6 23|1 7 11|1 8 5|1 9 2|0 10 1|1 11 0 |
parte frazion. 0.00885|0 -1 0.0177 |0 -2 0.0354 |0 -3 0.0708 |0 -4 0.1416 |0 -5 0.2832 |0 -6 0.5664 |1 -7 0.1328 |0 -8 0.2656 |0 -9 0.5312 |1 -10 0.0624 |0 -11 0.1248 |0 -12 0.2496 |0 -13 0.4992 |0 -14 0.9984 |1 -15 0.9968 |1 -16 0.9936 |1 -17 0.9872 | |
| In virgola fissa | 110001,10000… | 1001110001,0… | 11,001000111 | 101110101110 | 0,00000010010000111 |
| Normalizzazione | 1,1000110000…*25 | 1,0011100010…*29 | 1,1001000111*21 | 1,0111010111*211 | 1,0010000111*2-7 |
| Biasing esponente e conv. in binario | 127+5=132 → 100001002 | 127+9=136 → 100010002 | 15+1=16 → 100002 | 15+11=26 → 110102 | 15-7=8 → 010002 |
| Risultato | 1 10000100 1000110000… | 0 10001000 0011100010… | 0 10000 1001000111 | 0 11010 0111010111 | 0 01000 0010000111 |
3.7510 = 11.112 = 1.1112 × 21
Segno: 0 (positivo)
Esponente: 1 + 127 = 128 = 100000002
Mantissa: 11100000000000000000000 (23 bit)
Risultato: 0 10000000 11100000000000000000000
-0.12510 = -0.0012 = -1.02 × 2-3
Segno: 1 (negativo)
Esponente: -3 + 127 = 124 = 011111002
Mantissa: 00000000000000000000000
Risultato: 1 01111100 00000000000000000000000
Per approfondimenti: