Lezione X                                    FRAMES   NOFRAMES

Rappresentazione dell’ informazione parte II

 

Continuiamo quanto fatto nella lezione 9 interessandoci di come si rappresentano i

 

Numeri interi in memoria centrale

 

I numeri interi vengono rappresentati in una o più celle di memoria di un calcolatore ;

facciamo le seguenti ipotesi:

a) usiamo il sistema binario

b) usiamo numeri interi relativi

c) rappresentiamo un numero usando una cella (locazione) di 16 bit, per cui usiamo numerali da 16 cifre binarie.

Con 16 bit si rappresentano 2^16 ‘diversi numeri’ , da 0 fino a 2^16 -1 ossia da 0000000000000000 fino a 1111111111111111 

ossia da [0 fino a 65535]; ma questi numeri sarebbero tutti quanti positivi per cui ci chiediamo se esiste un metodo per rappresentare tutti i numeri interi  positivi e negativi ( interi relativi ) ? 

si esistono la rappresentazione in modulo e segno e la rappresentazione in complemento alla base.

 

Rappresentazione in modulo e segno

Nella rappresentazione in modulo e segno un bit (il primo) viene riservato per il segno, precisamente 0 per i numeri positivi ed 1 per i numeri negativi, i rimanenti 15 bit servono a rappresentare il numerale (il modulo del numero). 

Con 15 bit si rappresentano 2^15 diversi numerali: da 000000000000000 a 111111111111111. Precisamente:

0 000000000000000 rappresenta lo zero

0 000000000000001                   l’ uno

*

0 111111111111111                  +32767

1 111111111111111                  -32767

*

1 000000000000000                  lo zero

tabella di rappresentazione in modulo e segno per n=16 bit 

 

valore

segno

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

+0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

+1

0        

0

 

0

0

0

0

0

0

0

0

0

0

0

0

1

+2

 

0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

.

0

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

+32767

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

-32767

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

-32766

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

0

.

1

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

-0

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

Con 3 bit possiamo rappresentare tutti i numeri positivi da 0 fino a 7 ed in modulo e segno tutti i numeri seguenti:

 

Tabella di rappresentazione in modulo e segno per n = 3 bit

valore

segno

1

0

+0

0

0

0

+1

0

0

1

+2

0

1

0

+3

0

1

1

-3

1

1

1

-2

1

1

0

-1

1

0

1

-0

1

0

0

 

Come si comprende bene la rappresentazione in modulo e segno è semplice ed intuitiva ma inefficiente e complessa nella gestione delle operazioni, per due cattive qualità che presenta: lo zero ha due rappresentazioni ed addizioni e sottrazioni sono abbastanza complicate; per questi motivi non viene molto usata nella pratica.

Con n bit si rappresentano tutti i numerali compresi nell’intervallo     [0 , 2^n -1].

Usa un bit per rappresentare il segno ( es. 0= +, 1= - ) e gli 

altri (n-1) bit per rappresentare il valore assoluto, come un numero binario puro.

L’ MSB è il segno. Fra i difetti notiamo che la complicazione di fare addizioni e sottrazioni nasce dal fatto che non si possono usare direttamente gli algoritmi di conversione gia noti. In particolare, non è vero che  Y + (-Y ) = 0 ; infatti se eseguiamo la somma +6 con -6 avremo, usando 5 bit:

 

valore

segno

3

2

1

0

+6

0

0

1

1

0

-6

1

0

1

1

0

somma

1

1

1

0

0

 

Vediamo che la somma non mi da il valore zero e quindi vengono richiesti circuiti più specifici e/o software più complesso per la realizzazione dei sommatori per cui si incrementa il costo.

 

Rappresentazione in complemento alla base

La rappresentazione in complemento alla base nasce al fine di poter utilizzare gli algoritmi dei numeri naturali per eseguire le operazioni, per rendere vera la proprietà Y + (-Y) = 0, pagando il prezzo di una notazione più complessa. Si abbia n bit ( cifre )  a disposizione per rappresentare un numero; i 2^n possibili numerali compresi nell’ intervallo [ 0, 1, … , 2^n -1] 

da 00…0 fino a 11…1 permettono di rappresentare 

i numeri    [-(2^n)/2 , (2^n)/2 =    [- 2^n/2 , 2^n/2].

I numerali [0, (2^n)/2 ) rappresentano i numeri [0, (2^n)/2 ) mentre i numerali  [(2^n)/2 , (2^n)-1] 

rappresentano i numeri [-(2^n)/2 , -1] = [-(2^n)/2 , 0). 

 

La parentesi tonda indica che l’estremo dell’intervallo è escluso la quadra che è incluso: 

intervallo aperto parentesi tonda, intervallo chiuso parentesi quadra.

 

Per definizione , il valore di un numero intero num espresso in complemento alla base b è dato dalla formula:                                                                                                                                                                                                                                                         

                                            n-2

 num =   -Cn-1*b^(n-1) +     S    Ck * b^k      

                                            k=0

 

Dove Ck ( con k=0...n-1) sono le cifre in base b della rappresentazione del numero; si noti che questa formula differisce da quella usata per i numeri naturali solo per il peso negativo dell’MSB e per il fatto che in quel caso b=2 .

Per n =3 e b=2

num = -C2 * 2^2 + C0 *2^0 + C1 * 2^1

Se C2=1 C1=1 C0=0 ossia il numerale 110

num = -1*4 + 0*1 + 1*2 = -2

Ad ogni numero X Î [ -(2^n)/2 , 2(^n)/2 ) corrisponde un Numerale          RAPP(X) Î [0, 2^n ) come segue:

RAPP(X) = X                 se  0<= X < 2^n/2

RAPP(X) = 2^n - | X |    se -2^n/2 <=X < 0

In sostanza [ -2^n /2 , 2^n /2 ) è l’ intervallo dei numeri rappresentabili con i numerali  

[0, 2^n ) cioè [000…00 , 000…01,……….., 111…11 ] ognuno formato da n bit.

 

Esempio

n=3 bit

NUMERI       [ -2^3 /2 , 2^3 /2) = [-4 , 3] ;

NUMERALI  [000, 001, 010 , 011, 100, 101, 110, 111]

 

0

1

2

3

-4

-3

-2

-1

NUMERI

0

000

1

001

2

010

3

011

4

100

5

101

6

110

7

111

NUMERALI

NUMERALI

 

In sostanza dato X rappresentabile :

Se X > = 0  RAPP(X) = ( X ) in base 2.

Se X <    0  RAPP(X) = complemento a 2^n del valore assoluto di X ossia quel che manca al |X| per arrivare a 2^n.

Esempio

Per X= -1  RAPP(X) = 2^3 -|-1| = 7 = (111) in base 2.

Per X = -4 RAPP(X) = 2^3 - |-4|= 4 = (100) in base 2.

 

Esempio

n=6 bit ® 64 combinazioni

Numerali [000000, 000001, ….. 111111] = [0, 2^6 -1] = [0 , 63]

Numeri    [ -2^6 /2 , 2^6 /2 ) = [ -32 , 31 ]

 

RAPP(0) =

0

000000

RAPP(1) =

1

000001

……………

.

…….

RAPP(20) =

20

010100

……………

.

……

RAPP(31)=

31

011111

 

RAPP(32) =  NO !

 

RAPP(-1) = 64- | -1 | = 63 = ( 111111 ) in base 2

RAPP( -20) = 64 - | -20 | = 44 = ( 101100 ) in base 2

RAPP(-32 ) = 64 - | -32 | = 32 = ( 100000 ) in base 2

RAPP(-33) =  NO !

 

RAPP(-1 ) =

63

111111

RAPP(-2 ) =

62

111110

………….…

.

……

RAPP(-20) =

44

101100

………….…

.

……

 RAPP(-31) =

33

100001

RAPP(-32) =

32

100000

 

Osservazione

Per ogni n bit la rappresentazione del numero zero e del numero -1 sono :

RAPP( 0)  = 000..…0

RAPP(-1) = 111..…1

 

Osservazione

Per i numeri positivi rappresentabili avremo  RAPP(X) = 0……

Per i numeri negativi rappresentabili avremo RAPP(X) = 1……

                                       ¬®

Se X>=0 è rappresentabile avremo RAPP(X)= 0 seguito da cifre di X in base 2

Se X < 0 abbiamo il seguente metodo pratico

1)    Verificare che n è tale che X Î [-2^n /2 , 0 )

2)    Scrivere ( | X | ) in base 2 con n bit

3)    Scambiare 1 con 0 e viceversa

4)    Aggiungere 1.

 

Esempio

 

X= -20

 

1)    Quanti bit possiamo usare: n ?

n = 3  NO     XÏ [ -4  ,  3  ]

n = 4  NO     XÏ [ -8  ,  7  ]

n = 5  NO     XÏ [ -16 , 15]

n = 6  SI       XÎ [ -32 , 31]

n = 7  SI

scegliamo n=6

 

     2) ( 20 ) in base 10 = ( 10100 ) in base 2     5 bit !

                              = (010100) in base 2     6 bit

     3)  101011 +

              1

     4)  101100  infatti servono 6 bit.

 

Riassumendo , nella notazione in complemento a due abbiamo come campo dei valori rappresentabili :

il caso in cui l’ MSB =0 ® n-1 bit usabili come in binario puro ® range da 0 a 2^(n-1) - 1;

il caso in cui l’ MSB =1 ® lo stesso intervallo traslato 

di - 2^ (n-1) ® range da -2^(n-1) a -1;

complessivamente abbiamo un range (intervallo) 

da -2^(n-1) a  2^(n-1)-1 .

Notiamo che nella rappresentazione in complemento alla base lo zero ha una unica rappresentazione.

L’MSB = 0 implica numero positivo; l’ MSB=1 implica numero negativo.

 

Allora per trasformare un numero intero relativo in complemento a due si devono usare due metodi pratici:

1)    Se il numero e’ positivo (MSB =0) allora la rappresentazione in complemento a due coincide con il numero binario stesso ;

2)    Se in numero è negativo (MSB=1) allora la rappresentazione in complemento a due si ottiene complementando  tutti i bit cioè l’1 si trasforma in zero e viceversa ed aggiungendo 1 alla rappresentazione complementata; questo secondo metodo coincide con il complementare tutti i bit, partendo dal meno significativo al più significativo, che si incontrano dopo il primo bit 1, quest’ultimo escluso dalla complementazione.

Esempio

Calcolare il complemento a due del seguente numero in base 2

100100100

si parte dal bit meno significativo e dopo aver incontrato il primo bit 1, inizio a complementarli tutti ottenendo 011011100

 

Rappresentazione dei caratteri

 

Si associa un unico numerale a ciascun carattere cioè si definisce la codifica :

carattere Û NUMERALE = sequenza di bit = codice.

 

Con n=8 bit si possono rappresentare 2^8 codici diversi. Questo è il modo più diffuso.

A seconda del numerale associato ad ogni carattere si hanno codifiche diverse;

la codifica più diffusa è la ASCII dove vi sono rappresentati 256 caratteri attraverso un numero (da 0 a 255 ).

Notiamo che con il termine carattere si intende quell’alfabeto di simboli, riconosciuto da un determinato elaboratore, costituito da lettere dell’ alfabeto inglese, cifre numeriche e simboli speciali 

( segni di interpunzione, parentesi, simboli operazionali, ecc ).

 

I numeri reali

 

I numeri reali in matematica sono un soprainsieme dei numeri interi, in cui alcune delle proprietà dei numeri interi non sono verificate.

Notiamo che in un calcolatore un numero reale non può essere rappresentato in modo finito;

ad esempio i numeri irrazionali tipo sqrt (2), pi-greco, non sono rappresentabili in modo finito in nessuna base.

Un numero razionale può risultare periodico o no a seconda della base che usiamo per rappresentarlo:

esempio

1/3 = (0.33333333333…) in base 10 = (0.1) in base 3

In particolare si avra’ che  un numero se e’ periodico quando viene rappresentato in base b, e’ ancora periodico in una qualunque altra base b2 che sia un fattore di b, (b=k*b2) con (k=1,2,3…) . Il viceversa vale soltanto se b e’ una potenza di b2, (b=b2(^n)). Per cui se un numero N ha una rappresentazione periodica in base b=10, avremo che N in base 2 od N in base 5 avranno rappresentazione periodica (ma non necessariamente viceversa).

Se N e’ periodico quando rappresentato in base b2=2, sara’ periodico anche in base b=4, b=8, b=16, ..,b=128,ecc.

esempio

Il numero reale -23.72 = -.2372E2=-.2372x10^2

In matematica dato un numero reale N, una base b ed un numero naturale n, e’ sempre possibile rappresentare il numero N come la somma di due contributi, di cui il primo e’ costituito esattamente da n cifre.

In sostanza per ogni numero naturale N si possono determinare

a)    una mantissa m (reale) di n cifre

b)    un esponente exp (intero)

c)    un resto res (reale)

in modo da poter esprimere N come :

N= m*b^exp + res* b^(exp-n)

 

Si hanno infinite triple ( m, exp , res ) che possono rappresentare lo stesso valore reale del numero N a parita’ di n.

 

 Consideriamo il caso del numero N=23.72 con b=10 ed n=3

  Ripartizione                                        

m

exp

res

237    *  10^-1 +  200.       *  10^(-1-3)

237

-1

200

23.7   *  10^0  +    20.       *  10^ (0-3)

23.7

 0

20

2.37   * 10^1   +      2.0      *  10^ (1-3)

 2.37

+1

2

.237   * 10^2   +        .2      *  10^ (2-3)

 .237

+2

.2

.023   * 10^3   +        .072   *  10^ (3-3)

  .023

+3

.72

.002   * 10^4   +        .3720 *  10^ (4-3)

  .002

+4

.3720

.000   * 10^5   +        .23720*  10^ (5-3)

  .000

+5

.23720

 

Per rappresentare un numero reale si usano di solito 2 celle di 16 bit. Esistono diversi modi di rappresentarli. Noi ne vedremo soltanto due.

Un criterio generale per capire le qualita’ ed i difetti di una rappresentazione e’:

1)    Quanti numeri sono rappresentabili

2)    Quanto sono complicate le operazioni fatte usando quella rappresentazione.

 

Rappresentazione in virgola fissa

 

Vi e’ un numero fissato di cifre (bit) per la parte intera e per la parte frazionaria ed un bit per il segno.

 

1

2

……….

15

16

17

18

….…..

31

32

segno

Parte intera

Parte frazionaria

 

La parte intera e’ un intero positivo di 15 bit compreso nel range [0, 2^15 -1].

La parte frazionaria e’ un intero positivo di 16 bit compreso nel range [0, 2^16 -1].

Sono rappresentabili i numeri da -32767,65534 a +32767,65534 (pochi !).

 

Rappresentazione in virgola mobile 
( Floating point )

 

Una parte dei bit contiene la sequenza di cifre che compongono il numero una altra parte dei bit esprime dove va messa la virgola tra quelle cifre. Nessun punto e’ fissato per la virgola.

Esempio

23.72 = .2372 * 10^2 dove .2372 e’ la mantissa m ,10 e’ la base b ed il 2 e’ la caratteristica exp (intero relativo).

Forma normalizzata

Potremmo equivalentemente scrivere .002372*10^4 oppure 2372*10^-2 oppure 23.72*10^0 ; in sostanza avremo diverse mantisse cambiando la caratteristica.

Affinche’ la rappresentazione di un dato valore sia unica quindi occorre fare una scelta:

a) ipotesi: mantissa normalizzata compresa fra [0 ,1) avente la prima cifra diversa da zero.

b) conseguenza: 1/b <= | m | <1 perche’ la minima cifra diversa da zero e’ 1, ed (0.1) in base b e’ uguale a (1/b) in base 10. Nel nostro caso 1/10 <= | m | <1 : diciamo che il numero e’ in forma normalizzata se 1/b <= | mantissa | < 1.

In generale un numero N reale in base b si rappresenta in forma normalizzata con mantissa m e caratteristica exp dove:

N= m*b^exp  con 1/b <= | m | <1.

 

Nell’ esempio del numero 23.72 la riga evidenziata in blu rappresenta la sua forma normalizzata, molto efficiente perche’ sfrutta tutte le n cifre disponibili per la mantissa

Senza sprecarle per zeri iniziali che non portano vera informazione ( come si avrebbe nel caso exp > 2).

Esempio

11001.1001 e’ 25.5625

mantissa m = .110011001 caratteristica exp = 5

m=?

1*2^-1 + 1*2^-2 + 0 +0 +1*2^-5 + 1*2^-6 + 0 + 0 +1*2^-9

m*b^exp = 1*2^4 +1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 + 1*2^-1 +0*2^-2 + 0*2^-3 + 1*2^-4     = 11001.1001

Moltiplicare un numero binario per una potenza di 2 ha il medesimo effetto che si ha moltiplicando un decimale per una potenza di 10 ossia sposta la virgola.

.111*2^2 = 11.1

(7/8 * 4 =3.5 ) =( 3+1/2 = 3.5 )

osservazione

1/b <= | m | < 1 questo implica che in base b=2 avremo : 

1/2 <= | m | < 1

( 0.5 ) in base 10 = ( .1 ) in base 2

( 0.75 ) in base 10 = ( .11) in base 2

per cui m=.1… sempre 1 all’ inizio della mantissa come abbiamo su preannunciato.

 

I Numeri reali essendo un insieme infinito, nell’ elaboratore si devono per forza rappresentare in forma approssimata.

Si assume di rappresentare soltanto come abbiamo visto il contributo al numero N del  termine m*b^exp trascurando res*b^(exp-n)

 

res*b^(exp-n)  rappresenta la frazione troncata del valore N. Notiamo che i soli valori che vengono rappresentati in modo corretto nell’ elaboratore sono quelli che hanno resto zero cioe’ quelli con res=0.

 

Decidere la rappresentazione dei numeri reali in un elaboratore, che opera in base 2, equivale:

a)    stabilire il max numero n di bit disponibili per la mantissa;

b)                la rappresentazione del segno del numero;

c)                                             dell’esponente intero exp.

 

 

 

Introduciamo adesso un modello di comodo per stabilire come inserire m ed exp nelle due celle da 16 bit.

1 bit viene riservato al segno; 7 bit alla caratteristica od esponente exp, generalmente un intero in complemento a due; 24 bit vengono riservati alla mantissa espressa in forma normalizzata con il primo bit pari a 1 ossia l’MSB della mantissa =1.

 

Esempio

Rappresentazione del numero 25.5625

m =110011001 exp = 101

l’ esponente 5 in binario essendo positivo coincide con la rappresentazione in complemento a due , il segno del numero e’ positivo per cui si avra ‘:

 

0

0

0

0

0

1

0

1

1

1

0

0

1

1

0

0

1

0

.

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

.

.

32

 

Esempio

( 0.156251 ) in base 10 = ( .00101 ) in base 2

m= .101 in quanto non puo’ essere 0 il suo MSB per cui

exp = -2

ma  (-2 ) in base 10 = ( 1111110) in complemento a due con 7 bit.

Si avra’ bit 0 per il segno ;

1111110 per l’ esponente e

101000000000000000000000 per la mantissa normalizzata con 24 bit. Nei computer reali in genere l'MSB  della mantissa normalizzata  viene omesso in quanto e'  sempre pari ad 1.

 


 

                                                             esercizio

 

Test 10