Per codificare in binario i numeri razionali si usa il seguente procedimento:

Esempio:
17,36

17 = 16 + 1 = 10001

0,36*2=[0],72 |
0,72*2=[1],44 |
0,44*2=[0],88 |
0,88*2=[1],76 |
0,76*2=[1],52 v   da ripetere tante volte quanto sono i bit disponibili

0,36 = 01011

17,36 = 10001,01011

Volendo standardizzare la codifica, quanti bit si devono allocare per la parte intera e per la parte decimale?

con la virgola fissa

Si usa un numero fisso bit totali:

  • un numero fisso di bit per la parte intera
  • bit per la parte frazionaria

con la virgola mobile (IEEE 754)

Come nella notazione scientifica esprimiamo il valore usando una potenza della base adeguata. Lo standard odierno della rappresentazione dei numeri decimali in virgola mobile è “l’IEEE 754” (I triple E), in cui gli bit della rappresentazione si dividono in:

  • segno (a cui è dedicato un singolo bit , negativo se e positivo se )
  • esponente (del della notazione scientifica)
  • mantissa (i bit dopo la virgola, l’1 della parte intera è sempre implicito)

N.B.: la parte intera del numero non viene codificata in dei bit dedicati. Anche se in base 10 può sembrare strano, in base binaria basta scegliere l’esponente in modo che la cifra più significativa sia sempre un 1 per ogni numero.

esempio:

codifiche con livelli di precisione diversi

ns (segno)e (esponente)m (mantissa)
16half precision (HP)1510
32single precision (SP)1823
64double precision (DP)11153

esponente

  • Si considera la rappresentazione in complemento a 2 (CA2): con bit rappresento un’intervallo di valori possibili di .
  • Si aggiunge il bias in modo che l’esponente sia positivo.

esempio: se il bias è se il bias è

  • Si ottiene l’intervallo .
  • Si eliminano i due valori più piccoli, cioè -1 e 0, ottenendo , in binario

rappresentazione

Nello standard IEEE 754, il segno, l’esponente e l mantissa di un numero in virgola mobile viene rappresentato mettendo vicini i bit del segno, dell’esponente e della mantissa; talvolta si usa la base esadecimale (base 16, più compatta del binario) in cui ogni numero rappresenta 4 bit.

Esempio: 26,42 = <0;10011;1010011010> = 0100111010011010
0100 = 4
1110 = E
1001 = 9
1010 = A
26,42 = 0x4E9A

categorie di valori

tipoesponentemantissasegno
zero00+/-
numeri denormalizzati/subnormal (prossimi allo 0)0 0+/-
numeri normalizzatiqualunque+/-
infiniti (tutti 1)0+/-
NaN (Not A Number) (tutti 1) 0+/-

Esempio in half-precision ()

overflow negativi
negativi rappresentabili
underflow negativi
underflow positivi
positivi rappresentabili
overflow positivi

esempi di rappresentazione in virgola mobile:

Esempio: n = 16 bit, segno = 1 bit, esponente = 5 bit, mantissa = 10, bias = 15

A = 26,84

26 | 0 ^
13 | 1 ^
 6 | 0 ^
 3 | 1 ^
 1 | 1 ^

26 = 11010

0,42*2 | 0,84 v
0,84*2 | 1,68 v
0,68*2 | 1,36 v
0,36*2 | 0,72 v
0,72*2 | 1,44 v
0,44*2 | 0,88 v

0,84 = 011010

26,84 = 11010,011010 = 1,1010011010*2^4

esponente = 4+15 (bias) = 19(base 10) = 10011

26,42 = <0;10011;1010011010> (approssimazione)

il computer userà 0100111010011010, in esadecimale (0x) sarà:
0100 | 4
1110 | E
1001 | 9
1010 | A
-> 0x4E9A

Esempio: Dato C9A0 nello standard IEEE 754 half precision convertilo in base 10

C = 1100
9 = 1001
A = 1010
0 = 0000

<1.10010.0110100000>
^      ^      ^
segno  exp.   mantissa

10010 = exp+bias (18)
- bias (15) = 3 (exp) = 2^3 = 100 (base 2)

numero = -1*2^3*1.40625 (1.0110100000) = -11.25
Esempio in half precision (n = 16 bit, segno = 1 bit, esponente = 5 bit, mantissa = 10, bias = 15)

-37.68

37 | 1
18 | 0
 9 | 1
 4 | 0
 2 | 0
 1 | 1 ^

.68 | 1.36 v
.36 | 0.72
.72 | 1.44
.44 | 0.88
.88 | 1.76

100101.10101 = 1.0010110101*2^5
esponente + bias = 5+15 = 20(base 10) = 10100
20 | 0
10 | 0
 5 | 1
 2 | 0
 1 | 1 ^

37.68 = <1;10100;0010110110> = 0xD0B5

1101 = D
0000 = 0
1011 = B
0110 = 5