Rappresentazione di Numeri Reali Un numero reale è una grandezza analogica (continua) e quindi è rappresentabile solo in modo approssimato. Esistono due forme per rappresentare un numero reale Segno, parte intera, parte decimale (rappresentazione in virgola fissa) Segno, mantissa, esponente (rappresentazione in virgola mobile)
Rappresentazione in virgola fissa (fixed-point) Utilizzando una rappresentazione su N bit si assume che la posizione della virgola sia fissa in un preciso punto all’interno della sequenza. Quindi si assegnano k bit per la parte intera e N-k bit per la parte decimale NB In una rappresentazione di tipo posizionale le cifre alla destra della virgola vengono moltiplicate per potenze negative della base Es. (5.75)10 = 5*100 + 7*10-1 + 5*10-2 (11.011)2 = 1*21 + 1*20 + 0*2-1 + 1*2-2 + 1*2-3
Conversione decimale-binario di numeri non interi La parte intera si converte col metodo delle divisioni successive Per la parte alla destra della virgola: si moltiplica la parte a destra della virgola per 2 si prende la parte intera del risultato come cifra utile si ripetono i 2 passi precedenti finché la parte a destra della virgola non diventa 0 Es. 19.375 Sappiamo che (19)10 = (10011)2 0.375 * 2 = 0.75 0.75 * 2 = 1.5 0.5 * 2 = 1.0 Quindi (19.375)10 = (10011.011)2
Osservazione importante Non è detto che un numero che ha una rappresentazione finita in una base, abbia una rappresentazione finita anche in un’altra. Es. 1/3 = (0.1)3 = (0.33333….)10 L’unico caso in cui questo avviene sicuramente è quando si converte da una base ad un’altra che ne è una potenza. (101011100110.011)2 = (5346.3)8
Rappresentazione in virgola mobile (floating-point) Ricorda la notazione scientifica dei numeri Si riescono a manipolare numeri con ordini di grandezza molto differenti utilizzando per la rappresentazione un insieme limitato di bit Nel formato esponenziale un numero N viene espresso nella seguente forma b base del sistema di numerazione m mantissa del numero e esponente
Rappresentazione in virgola mobile (floating-point) b è 2 (la base è prefissata) Quindi per rappresentare un numero reale ci basta rappresentare mantissa ed esponente. La mantissa si suppone in virgola fissa con la virgola all’inizio,seguita sempre da 1 (MSB). Es (decimale) 123.45 = .12345 * 103 (binario) 11.1011 = .111011 * 22 Ricorda: moltiplicare (dividere) un numero per una potenza della base equivale a far scorrere a sinistra (destra) il numero di un numero di posizioni pari all’esponente
Rappresentazione standard Su 32 bit 1 bit per segno del numero 8 bit per esponente (generalmente rappresentato in complemento a due) 23 bit per la parte frazionaria della mantissa la parte non frazionaria (0) e la prima cifra (1) della mantissa vengono sottintese 0 può avere segno positivo o negativo
Somma di due numeri in virgola mobile Quando si fanno somme, anche a mano, per sommare due numeri è necessario incolonnarli. In una rappresentazione in virgola mobile questo significa uguagliare gli esponenti. Es. (decimale) 123.5 + 1240.3 In virgola mobile .1235 * 103 + .12403 * 104 Quindi devo per prima cosa riportare i due numeri all’esponente più grande 123.5 = .01235 * 104 … e poi posso sommare .01235 + Quindi: .12403 -------- 123.5 + 1240.3 = .13638 * 104 = 1363.8 .13638
Approssimazioni nelle operazioni in floating point Quando la distanza fra la cifra più significativa e quella meno significativa è maggiore del numero di cifre a disposizione, il numero deve essere troncato: si trascurano cioè le cifre meno significative per le quali “non c’è spazio”. Es. Supponendo di usare 4 bit per la mantissa 10 + 0.5 10 = .1101 * 24 0.5 = 0.1 * 20 Il risultato sarebbe 0.11011 * 24 , ma ho solo 4 bit Quindi il risultato è 0.1101 * 24, e quindi 10+0.5=10!
Approssimazioni nelle operazioni in floating point Apparente paradosso: 10.5 non è rappresentabile con 4 bit, ma 15 sì! 15 = .1111 * 24 Per avere un’idea della precisione con cui opera un calcolatore (numero N di bit con cui rappresenta la mantissa in floating point) si definisce precisione di macchina (epsilon) il più piccolo numero che sommato a 1 dà un risultato diverso da 1. Maggiore è N, più piccolo è epsilon.