Ripetizioni



Rappresentazione dei numeri reali in virgola mobile


Pubblicato il 2 Marzo 2011 da Capu


Nei computer la rappresentazione dei numeri reali è particolare. Essi sono rappresentati da 3 entità: Il segno penso sappiate cosa sia, indica la posizione del nostro numero sulla retta dei numeri rispetto allo 0. Chiariamo invece cosa sono esponente e mantissa.
Per rappresentare un numero reale, dobbiamo normalizzarlo (secondo lo standard IEEE754) in un numero che abbia tutte le cifre dietro (a destra) la virgola, tipo "0,xxxxxx". Questo numero, scritto con tutte le cifre dietro la virgola, è detto mantissa.
Ora, siccome il nostro numero molto probabilemente non aveva tutte le cifre dietro la virgola, dobbiamo specificare, nella nostra rappresentazione, quante cifre ha prima della virgola. Questo numero è l'esponente, e per trovarlo basta semplicemente contare il numero di cifre che il mio numero ha prima della virgola (prima che l'abbia normalizzato naturalmente). Bisogna poi dire che se il numero che ho è già nella forma "0,xxxxxx" con la prima cifra dopo la virgola diversa da 0, l'esponente sarà uguale a 0; mentre se ho dopo la virgola degli zeri e poi altre cifre, l'esponente lo ottengo contando questi zeri, ma mettendolo negativo.
Esempio:

Il nostro numero è rappresentato: abbiamo le tre entità che ci servono. Questo procedimento l'abbiamo eseguito però in base 10 (sistema decimale, il nostro sistema di numerazione!), ma come ben sappiamo i computer utilizzano solo il sistema binario (base 2).
Come fare? Non preoccupatevi, cambiano solamente due cose:
  1. Dobbiamo convertire all'inizio il nostro numero da base 10 a base 2 (parte intera con le divisioni per 2, parte decimale con le moltiplicazione per 2; e ricordate il diverso ordinamento delle cifre!)
  2. Dobbiamo rappresentare correttamente l'esponente, sia se è negativo, sia se è positivo. Invece di usare il complemento a 2 si usa il complemento a 127, che sostanzialmente consiste in
    • Se l'esponente è negativo, il nostro esponente sarà: 127-|EXP|, che convertirò in binario
    • Se l'esponente è positivo, il nostro esponente sarà: 127+|EXP|, che convertirò in binario
    Il numero all'interno delle barrette (|numero|) sta ad indicare il valore assoluto del numero, cioè senza il segno.
Ora non rimane che "organizzare" queste 3 entità. Per fare ciò ci sono due strade:
  1. Float
    Utilizza 32 bit così suddivisi:
    • 1 bit per il segno
    • 8 bit per l'esponente
    • 23 bit per la mantissa
  2. Double
    Utilizza 64 bit così suddivisi:
    • 1 bit per il segno
    • 11 bit per l'esponente
    • 52 bit per la mantissa
Nel fare gli esercizi rappresenteremo i vari bit del float e del double come cellette.

Un esercizio guidato: trasformare un numero dato in float e eseguire la verifica
Numero dato (N) = -36,75

Conversione
Intanto possiamo già definire una delle 3 entità: il segno, è negativo, lo si indica con l'1
SEGNO: 1
Dopo aver definito il segno, di questo non ce ne importa più: nei calcoli considereremo solo il valore assoluto del numero, quindi:
Parte intera = 36
Parte decimale = 0,75
Trasformiamo le due parti in binario:
36(10) = 100100(2)
0,75(10) = 0,11(2)
E uniamole, trovando così il nostro numero convertito in binario:
36,75(10) = 100100,11(2)
Adesso dobbiamo normalizzarlo: portiamo quindi tutte le cifre del numero dopo la virgola
N = 0,10010011(2)
Importante: a questo numero, togliamo la parte davanti (0,1) per trovare la mantissa, poichè di sicuro questa è 0,1 (se fosse 0,0 metteremmo una cifra in più all'esponente) Questa sarà la nostra mantissa
MANTISSA: 0010011
L'esponente sarà il numero di cifre che avevamo prima della virgola, nel nostro caso 6
Ricordiamoci di fare il complemento a 127 (spiegato sopra) del numero
EXP = 127 + |+6| = 127 + 6 = 133
E di convertirlo in binario
133(10) = 10000101(2)
ESPONENTE: 10000101
Ora compiliamo le nostre 32 cellette del float:

1 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Verifica
Partiamo dal bit del segno: è 1, cioè -
SEGNO: -
Esaminiamo l'esponente:
Innazitutto, dobbiamo trovarne il segno: se è il numero è maggiore o uguale a 127 vuoldire che quando abbiamo fatto il complemento a 127 abbiamo aggiunto 0 o un numero maggiore, e quindi l'esponente è positivo. Se invece è minore, vuoldire che abbiamo sottratto e quindi l'esponente è negativo.
Partiamo con il convertirlo in base 10
10000101(2) = 133(10)
E' maggiore di 127, quindi è positivo. Per trovare il vero valore, sottraiamogli 127
133 - 127 = +6
ESPONENTE: +6
Guardiamo la mantissa: per essa basta convertire il numero in base 10, ma attenti! Ricordiamoci di riaggiungere lo 0,1 che avevamo tolto da davanti al numero. Quindi sarà:
0,10010011(2)= 1 x 2^-1 + 1 x 2^-4 + 1 x 2^-7 + 1 x 2^-8 = 0,57421875(10)
MANTISSA: 0,57421875
Ora dobbiamo combinare segno, mantissa ed esponente per riottenere il numero.
Il valore assoluto del numero c'è dato dalla moltiplicazione tra la mantissa e la base in cui stiamo lavorando (quindi 2, perchè siamo in binario) elevata per l'esponente, quindi:
|N| = 0,57421875 x 2^6 = 36,75
Adesso basta attacarci il segno:
N = -36,75
Ed ecco ricomparso il numero iniziale!