1
SISTEMI DI
RAPPRESENTAZIONE
DI NUMERI
rappresentazione di numeri
contenuto:
rappresentazione di numeri in basi diverse
rappresentazione binaria,
rappresentazione di numeri con segno,
rappresentazione di numeri molto grandi e molto piccoli
aritmetica floating-point
2
rappresentazione di numeri
nel calcolatore i codici per rappresentare i numeri
sono in generale fissi – questo perche'
le celle di memoria centrale dove sono memorizzati i
numeri (quando usati da un programma)
sono a formato fisso (ad es. 32 bit o 64 bit)
e i circuiti che eseguono le operazioni aritmetiche
(sia per interi che per virgola mobile)
sono a formato fisso;
3
rappresentazione di numeri
memoria: insieme di celle ( o voci ) numerate:
ciascuna ha un indirizzo (numero della cella)
(indirizzi da 0 a max, numeri da N bit,
gli indirizzi oggi arrivano al Gbyte,
sono numeri a 32 bit, limite che sta aumentando)
e un contenuto = valore o codice del dato memorizzato
nella cella: K bit, dove
K e' una potenza di 2, ad es 8, 16, 32, 64 bit:
questo e' fisso per tutte le celle del calcolatore;
la circuiteria elettronica che gestisce la memoria svolge la
funzione di accesso alla memoria:
leggi un dato ( di K bit) dalla cella di memoria di
indirizzo I (di N bit)
scrivi un dato ( di K bit) nella cella di memoria di
indirizzo I (di N bit)
4
rappresentazione di numeri
l'UC esegue le istruzioni dei programmi
la parte dell'unita' centrale che esegue le operazioni
aritmetiche (+ - * /) e' detta unita'aritmetica, ed e' quasi
sempre sdoppiata in
* unita' per aritmetica intera
* unita' per aritmetica in virgola mobile
entrambe hanno i canali
di ingresso dati e
di uscita dati (risultati)
a formato fisso, ad es. 32 oppure 64 bit
(ma anche piu', 80 bit, 128 bit)
==>>
i dati interi e in virgola mobile sono a formato fisso
5
rappresentazione di numeri
6
agli inizi sono stati usati sistemi di codifica di numeri
di tipo diverso :
* per soddisfare le esigenze di calcolo scientifico e
* e per soddisfare le esigenze delle applicazioni
commerciali:
per il calcolo scientifico furono adottati i due
formati di codifica:
numeri interi con segno +06220716
numeri in virgola mobile con segno +3,1415927E-0
entrambi a formato fisso (es. sopra, otto cifre)
i primi 15 anni esistevano calcolatori con codifica di
numeri a lunghezza variabile e HW opportuno per
trattarli; oggi esistono codifiche a lunghezza
variabile ma sono in generale gestite software;
rappresentazione di numeri
* per esigenze delle applicazioni commerciali
esistono linguaggi di programmazione e sistemi
software con codifica di numeri a lunghezza
variabile, di tre tipi:
interi
numero pini davanti il Tutankamen: 2
numero anni galera per falso in bilancio: 0
numero esami di fondamenti di informatica 1 all'anno: 120
numero lingue ufficialmente riconosciute: 5000
quantita' testate atomiche XXX al 2002: 10240
numeri con virgola fissa es:
indennità mensile (netto) senatore + diaria+rimborsi: 12.138,30 euro
deficit bilancia imp/exp al luglio 05 di XXX : 59500000000,0 $
numeri con virgola mobile
velocita' della luce : 299792,458 km/sec
massa elettrone: 9.10938188 × 10-31 kilo
7
rappresentazione di numeri
nel calcolatore i codici per rappresentare i numeri
sono in generale a formato fisso: il formato fisso
impone dei limiti ai possibili codici e quindi ai
possibili numeri

l' insieme dei numeri standard (interi e virgola
mobile) rappresentabili e' limitato
i numeri fuori dei limiti NON sono rappresentabili !
se un risultato produce un valore fuori di questi
limiti si ha un errore HW (eccezione o interrupt)
8
rappresentazione di numeri
talvolta e’ richiesta una rappresentazione esatta dei numeri,
qualunque sia il loro valore
es. bilancio di una ditta (pubblico o riservato)
devo rappresentare i dati esattamente ...
che sono appunto tipiche applicazioni commerciali :
per molte applicazioni di tale tipo la rappresentazione dei
numeri non e' a formato fisso, ma con sequenze di cifre di
lunghezza non fissa, delimitate con codici particolari …
(es. Linguaggio di programmazione Cobol)
particolari calcoli richiedono precisione molto spinta
(praticamente illimitata): in genere, gestita SW.
9
rappresentazione di numeri
10
altri esempi di dati di tipo intero:
*numero studenti del corso di fond. di inform. del 1996
*numero CD della biblioteca comunale del popolo,
*paga di ragazzo di 9 anni di una fabbrica Nike in Marocco,
*ammontare di una consulenza dell’avvocato Sgaioccich,
*patrimonio complessivo di Bill Gates,
rappresentazione di numeri
spesso interessa
** solo un certo numero di cifre di un dato
tipicamente per grandezze che hanno orgine
da misure tecniche o scientifiche, ad es.
* distanza terra - luna, (precisione di 10 cifre) oppure
* diametro cilindro della Honda GoldWing
(precisione di 4 cifre, al 1/100 di mm)
* quantita’ media di birra e di caffe’ (bevuta
da un tedesco medio) precisione di 2 cifre
** e l’ordine di grandezza ...
in unita' di misura appropriate,
come anni luce, chilometri, millimetri, piedi, pollici,
klaftre, galloni, barili,
11
rappresentazione di numeri
Per dati che hanno origine da misure (direttamente o
attraverso calcoli) viene usato
il formato in virgola mobile (*)
che specifica le cifre e l'ordine di grandezza con due interi
separati:
+3,14159265 E+00
dove i due numeri interi hanno un formato fisso (k1 e k2
cifre, qui k1=9 cifre e k2=2 cifre)
-------------------------------------------------------------------------------------------------------------
(*) formato in virgola fissa significa un intero che
rappresenta anche cifre decimali, ad es.: dati di 15 cifre:
00001 234 56 00000 rappresenta 1234, 56
00123 456 78 91230 rappresenta 123456,7891230
09999 999 00 00000 rappresenta 9999999
00000 000 00 23456 rappresenta 0,0023456
molto usato nelle macchine calcolatrici elettromeccaniche
12
rappresentazione di numeri
tutte queste esigenze hanno risposte oggi standard
nell’ambito della rappresentazione di numeri all’interno del
calcolatore, e nei limiti di queste rappresentazioni.
altri es
numero soci della Miracle.com
30402002 (unita')
altezza del tavolo
82,5 centimetri (valore approssimato a 3 cifre)
lunghezza delle coste marine italiane
9,532543E+3 chilometri ( ... falso, non so il valore vero;-)
valore di pi
3,14159265E+00 (approssimato a 8 cifre)
per capire meglio cos’e’ un oggetto tipo “numero” per il
calcolatore, studieremo di seguito i vari sistemi di
rappresentazione di numeri.
13
rappresentazione di numeri
14
tutti i dati / tutti i tipi di informazione per il calcolatore
si riducono a codici numerici;
es.: le immagini fotografiche o televisive o del cinema che
tradizionalmente nascono "analogiche" (segnale continuo) si
possono trasformare in dati numerici (in formato digitale)
analogamente i suoni (di vario genere) si possono codificare
numericamente (suono digitale)
si noti che la precisione (e quindi la qualita') ottenibile con
metodi analogici e' in generale minore rispetto la qualita' di
segnali codificati numericamente
rappresentazione di numeri
dispositivi convertitori :
ADC analog to digital
/
DAC digital to analog
nota in figura la perdita di informazione nel passaggio A->D
15
rappresentazione di numeri
16
tutti i dati / tutti i tipi di informazione per il calcolatore
si riducono a codici numerici; es.:
gli attributi di un punto dell’ immagine sullo schermo
(un elemento dell’immagine = Picture Element = PIXEL)
come intensita’ luminosa, tonalita’ di colore, saturazione,
oppure intensita’ dei colori primari che lo compongono
Rosso, Verde e Blu)
sono rappresentabili con valori numerici,
un pixel si codifica con "un" numero (una terna di num.)
l'immagine sullo schermo e'un insieme di numeri
(quanti – dipende dalla precisione immagine, va da 25 x 80
a 480 x 640 (VGA) a 1000 x 1600, 2000 x 3000 ecc ...
rappresentazione di numeri
un esempio di
immagine
resa con
risoluzione
variabile:
qui,
640x480 pixel
(VGA)
con 16M di
colori (24 bit
per pixel)
17
rappresentazione di numeri
riduciamo la
risoluzione
da 72
pix/pollice
per un fattore
4, abbiamo
un'immagine
a 160x120
pixel (VGA)
con 16M di
colori (24 bit
per pixel)
18
rappresentazione di numeri
riduciamo la
risoluzione
da 72
pix/pollice
per un fattore
10, abbiamo
un'immagine
a 64x48 pixel
(VGA)
con 16M di
colori (24 bit
per pixel)
19
rappresentazione di numeri
riduciamo la
risoluzione
da 72
pix/pollice
per un fattore
20, abbiamo
un'immagine
a 32x24 pixel
(VGA)
con 16M di
colori (24 bit
per pixel)
20
rappresentazione di numeri
se invece riduco
il numero di bit
per pixel, cioe' il
numero di
colori rappresentabili,
l'immagine
cambia come in
esempio:
qui con 16M
colori (24 bit
per pixel) e
640x480 pixel;
21
rappresentazione di numeri
qui con 256
colori (8 bit
per pixel) - la
differenza
quasi non si
vede
22
rappresentazione di numeri
qui con
16 colori
(4 bit per
pixel)
23
rappresentazione di numeri
qui con
4 colori
(2 bit per
pixel)
24
rappresentazione di numeri
qui con
2 colori
ovvero
bianco/nero
(1 bit per
pixel),
- ma:
con i toni
grigi resi
con griglie
di punti
piu'o meno
densi
(dithering)
25
rappresentazione di numeri
26
analogamente per il suono:
un suono puo' essere rappresentato da una sequenza
di valori numerici che rappresentano l'intensita'
del suono in ogni istante:
la " fedelta' " della rappresentazione di un suono
e' data da:
il numero di bit per un valore generico ad ogni istante
(da 8 a 16 e oltre) - precisione di ogni "campione"
il numero di valori per secondo (da 10 a 40 mila)
per poter ricostruire fedelmente un segnale nel tempo deve
essere la frequenza di campionamento almeno il doppio della
frequenza massima del segnale
rappresentazione di numeri
passiamo ora alla
codifica dei numeri
27
rappresentazione di numeri
28
i primi codici numerici codificavano un numero = il dato
numerico in "unario": per rappresentare n si usa un
simbolo ripetuto n volte (unario: c’e’ un solo simbolo, l’uno)
uno
due
tre
quattro
cinque
dieci
I
II
III
IIII
IIIII
III II III II
venti
||||| |||||
||||| |||||
trenta
||||| |||||
||||| |||||
sei
sette
otto
nove
III III
IIII III
IIII IIII
III III III
e poi?
||||| |||||
ma...
per “scrivere” cento oppure mille ... e’ un’impresa !!
rappresentazione di numeri
29
unario: per codificare n uso un solo simbolo ripetuto n volte:
uno
I
sei
III III
due
II
sette
IIII III
tre
III
otto
IIII IIII
quattro
IIII
nove
III III III
cinque
IIIII
…
la rappresentazione unaria va bene per numeri piccoli,
oppure per situazioni teoriche (casi particolari di alcune
macchine di Turing … lo vedremo in seguito)
non va bene per la scrittura abituale
non va bene per il calcolatore
rappresentazione di numeri
per semplificare la rappresentazione di numeri
circa 5000 anni fa in Egitto, Mesopotamia, poi Cina,
piu’ tardi - circa 3000 anni fa - in America (centro e sud),
per evitare la ripetizione eccessiva nel caso di numeri
maggiori di 10
si introdusse una codifica piu' economica:
si usarono dei simboli diversi per indicare
un gruppo di 10, 20, 30, 100, 500, 1000 simboli ecc
Il sistema inizialmente non prevedeva un simbolo per
indicare il numero zero.
Il numero zero fu introdotto
dai babilonesi circa 600 anni prima di Cristo
e poi ripreso in India e poi dagli arabi (800 d.c.,, prima
"universita'" araba) da qui in Spagna (1000 d.c.), poi in
Italia (1100) ecc.
30
rappresentazione di numeri
31
Dai sistemi di rappresentazione babilonesi / egiziani / fenici /
greci deriva il sistema di numerazione romano (ibrido)
Il sistema latino e' un codice non posizionale:
il valore numerico associato ad un simbolo dipende in
minima parte dalla sua posizione ed e' in gran parte fisso:
1
2
3
4
5
20
30
40
50
I
II
III
IV
V
6
7
8
9
10
XX
XXX
XL
L
VI
VII
VIII
IX
X
e, ancora, ->
11
12
13
14
15
XI
XII
XIII
XIV
XV
rappresentazione di numeri
sistema romano:
1
I
4 IV
10 X
20 XX
30 XXX
40 XL
50 L
100
200
300
400
500
....
C
CC
CCC
CD
D
32
5
V
60
70
80
90
LX
LXX
LXXX
XC
600
700
800
900
1000
DC
DCC
DCCC
CM
M
numeri - il sistema romano
33
le operazioni aritmetiche con il sistema di numerazione
romano o latino sono "piuttosto scomode" …
Si provi ad es. verificare che
MCMXCVI piu’ IV
=
MM (*)
oppure :
X LVI I I
________
volte
XIX
=
CMXII
(*) 1000+900+90+6 piu' 4 = 1996 piu' 4=2000
(+) 48 * 19 = 912
(+)
rappresentazione di numeri
per semplificare le operazioni di addizione
(e le altre operazioni aritmetiche)
si ricorreva al pallottoliere;
il pallottoliere e' rimasto in uso in molti paesi fino a
pochi decenni fa (Russia, Cina, Giappone)
dove il suo uso era insegnato a scuola
(talvolta lo e' ancora)
34
rappresentazione di numeri
35
CODICI NUMERICI POSIZIONALI
Un numero e' codificato (rappresentato) da una sequenza di
simboli, dove ogni simbolo ha un valore numerico definito
dalla posizione del simbolo nella sequenza:
1984
rappresenta un valore dato dalla somma di
1 migliaia
9 centinaia
8 decine
4 unita'
1984 rappresenta 1000 * 1 + 100 * 9 + 10 * 8 + 1
rappresentazione di numeri
36
CODICI NUMERICI POSIZIONALI
Un numero e' codificato (rappresentato) da una sequenza di
simboli, dove ogni simbolo ha un valore numerico definito
dalla posizione del simbolo nella sequenza.
Es: codice numerico posizionale con 4 simboli (cifre) :
abcd
(o qualunque altri 4 simboli)
Ad ogni simbolo si associa un valore numerico, ad es.:
a =3,
b = 2,
c = 1,
d = 0,
Una stringa di tali simboli e' un codice di un numero:
ad esempio abbac:
abbac rappresenta un valore numerico dato da:
n = a * p1 + b * p2 + b * p3 + a * p4 + c * p5
dove p1, p2, p3, p4 e p5 sono valori numerici o "pesi"
associati alle posizioni della stringa.
rappresentazione di numeri - un codice ... strano :
cont. es 4 simboli, a b c d a cui associamo i valori numerici
a =3, b = 2, c = 1, d = 0,
una stringa di tali simboli:
abbac
rappresenta un
valore numerico ottenuto dai simboli (cifre) moltiplicando
ogni cifra per un peso diverso (i pesi sono convenzionali) e
poi sommando:
n = r * p1 + t * p2 + r * p3 + r * p4 + s * p5
es. con i pesi (NON usuali! - anzi, decisamente strani...)
p1 = 200, p2 = 50, p3 = 17, p4 = 5, p5 = 71
il codice
abbac
vale
3*200 + 2*50 + 2*17 + 3*5 + 1*71 = ...
( sistema assolutamente inusuale... ;-)
37
rappresentazione di numeri
38
esempio: rappresentazione di numeri con 4 cifre:
a,b,c,d
(leggi: zero, uno, due, tre)
bacabb rappresenta un valore numerico
ottenuto dai simboli (cifre) moltiplicando ogni cifra per un
peso diverso (i pesi sono convenzionali) e poi sommando:
ca rappresenta il valore c * peso1 + a * peso0
scelta abituale: i pesi associati alle posizioni sono le
potenze di una costante detta base del sistema,
in un sistema a 4 cifre si assume convenzionalmente
peso0 = uno,
peso1 = quattro
ca = c * peso1 + a * peso0 quindi ca = c * quattro + a * uno
rappresentazione di numeri
nel sistema in base 4 o "quaternario" abbiamo 4 cifre:
a,b,c,d (leggi : zero, uno, due, tre),
la codifica abbac
rappresenta un valore numerico
ottenuto dai simboli (cifre) moltiplicando ogni cifra per un
peso diverso (i pesi sono convenzionali) e poi sommando:
n = a * p1 + b * p2 + b * p3 + a * p4 + c * p5
per il nostro sistema, una scelta e':
p5 (ultimo peso a destra)vale 1 (unita') cioe' 4 alla 0
p4 (penultimo peso a destra) vale 10 (quartine) = 4 alla 1
p3 vale 100 (sedicine) = 4 alla due, ecc
ba (vale b*p4+a*p5 = una quartina,zero unita')
bd (vale b*p4+d*p5 = una quartina,tre unita')
bac (vale b*p3 + a*p4 + c*p5=
una sedicina + zero quartine + due unita')
39
rappresentazione di numeri
sistema "quaternario" con 4 cifre:
a(zero), b(uno), c(due), d(tre)
scelta abituale: i pesi associati alle posizioni sono le
potenze di una costante detta base del sistema,
per il nostro sistema, una scelta potrebbe essere p5 vale 1
(unita'); p4 vale 10 (quartine), p3 vale 100(sedicine) ecc;
0) a
1) b
2) c
3) d
i primi 20 numeri
4) ba
5) bb
6) bc
7) bd
si scrivono
8) ca
9) cb
10) cc 11) cd
cosi' ...
12) da 13) db 14) dc 15) dd
16)baa 17)bab 18)bac 19)bad
20)bba 21)bbb 22)bbc 23)bbd
ad es : bbd =b*sedicine+b*quartine+d*unita'
40
rappresentazione di numeri
41
riscriviamo il sistema quaternario con 4 cifre:
al posto di a, b, c, d scrivo 0 1 2 3
per il nostro sistema, una scelta dei pesi (abituale):
p5 vale 1 (unita'); p4 vale 4 (quartine), p3 vale 16(sedicine)
diremo il sistema posizionale con base 4,
e per contare in base 4 avremo:
0) 0
4) 10
8) 20
12) 30
16)100
20)110
1) 1
5) 11
9) 21
13) 31
17)101
21)111
2) 2
3) 3
6) 12 7) 13
10) 22 11) 23
14) 32 15) 33
18)102 19)103
22)112 23)113
i primi 20 numeri
si scrivono
cosi' ...
ad es : 113 =1*sedicine+1*quartine+3*unita' =
riscritto in base dieci abituale: 113 = 16+4+3 = 23
rappresentazione di numeri
Il sistema piu' usato e’ il sistema numerico
con base dieci:
1187
42
posizionale
rappresenta
1*10^3 +9*10^2 +8*10^1 +7*10^0 =
1*1000 +1*100 +8*10
+7*
per un codice numerico posizionale in base b
uso un insieme di b cifre (simboli):
{ s1,s2,s3,... sb }
Un dato di n+1 cifre
c(n) c(n-1) c(n-2) c(n-3)...c(1) c(0)
rappresenta il numero (indico con b^k = b elevato alla k)
c(n)*b^n + c(n-1)*b^(n-1) + ... + c(1)*b^1 + c(0)*b^0
cioe’ (in base b): c n * 10..00 + .. + c 2 * 100 + c 1 * 10 + c 0 * 1
rappresentazione di numeri
si noti che nel sistema numerico
dieci:
1187
43
posizionale con base
rappresenta
1*10^3 +9*10^2 +8*10^1 +7*10^0 =
1*1000 +1*100
+8*10
+7* 1
si puo' scrivere anche cosi':
( ( ( ( ( 1*10 ) + 1 ) * 10 + 8 ) * 10 ) + 7 )
rappresentazione di numeri
per un sistema con 4 simboli (cifre) sara'
e i pesi saranno le potenze di 4:
p4..p0=
256
64
16
4
44
base = 4,
1
e quindi
d
b
d d c
con
(d =3, c = 2, b = 1, a = 0) rappresenta:
3*p4
+ 1*p3
3 * 10000 + 1 * 1000
3*4^4
+ 1*4^3
3*256
+ 1*64
+ 3*p2
+ 3 * 100
+ 3*4^2
+3*16
+ 3*p1 + 2*p0 =
+ 3 * 10 + 2 * 1 (in base 4) =
+ 3*4^1 + 2*4^0 = (base 10)
+ 3*4 + 2*1 =
768 + 64 + 48 + 12 + 2 = 832 + 62 = 894 in base 10
rappresentazione di numeri
45
I primi venti numeri sono rappresentati in base 4 come
segue (riportati numero in decimale e in base quattro):
0
1
2
3
4
5
6
7
8
9
10
0
1
2
3
10
11
12
13
20
21
22
<-
<-
11
12
13
14
15
16
17
18
19
20
23
30 <31
32
33
100 <- (non 40!)
101
102
103
110 <-
rappresentazione di numeri
46
es:
1323
rappresenta (e' la codifica di) :
1 * base^3 + 3 * base^2 + 2 * base ^1 + 3 * base^0
1 * 4*4*4 + 3 * 4*4
+2* 4
+3*1
ovvero:
1*64 + 3 * 16 + 2 * 4 + 3
….
e 1987 cosa rappresenta in base 4 ?
;-)
<<==
rappresentazione di numeri
...
in base quattro il numero
...
47
1987 ...
non rappresenta nulla
perche' 9,8,7 non sono cifre in base quattro -
in base b
le cifre vanno da 0 a b-1 !!
in ogni caso la base si scrive 10
e rappresenta il numero b (tranne in unario)
Es. in ottale ovvero con base otto le cifre sono:
0
1
2
3
e la base otto si scrive 10 !!
4
5
6
7
rappresentazione di numeri
nota che in ottale (base otto) il valore numerico della base e'
otto, che in base 8 si scrive 10
in genere in un sistema posizionale con base b,
b si scrive 10
otto in base 8 si scrive 10, e si indica con: 108
mentre si indica 8 in base 10 con: 810
quindi
108 = 810
48
rappresentazione di numeri
49
in ottale (base otto) si conta:
0
1
10(*) 11
20
21
30
2
3
4
5
6
7
12
22
13
23
14
24
15
25
16
26
17 (*) 108 = 810
27
65
66
67
75
76
77
...
...
...
...
73
74
a cui segue ->
70
71
72
-> 7*8+7 =63
100
101
102
107
110
....
111
112
117 -> 64+8+7 =79
rappresentazione di numeri
50
ad es. in base 12 ho dodici cifre,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B
dieci e undici in base 12 sono cifre, indicate con A e B !
quindi i primi 36 numeri - conto da 0 a 35 (35 in base 10):
0
10
20
30
40
50
60
1
11
21
31
41
...
...
2
12
22
32
42
3
13
23
33
43
4 5 6 7 8 9 A B (B vale 11)
36 ...
19 1A 1B (1B vale 23)
35 ...
29 2A 2B (2A vale 34)
34 ...
39 3A 3B (39 vale 45)
44 ...
49 4A 4B
(4B vale 4*12+B=48+11)
rappresentazione di numeri
CONVERSIONE da base b generica a base 10, esempio:
da base 8 a base 10, per definizione:
17 = 1*8+7 =15,
20 = 2*8 = 16,
76 = 7*8+6 = 62,
100 = 1*64 = 64 ecc
Per decodificare in base 10 un numero rappresentato
in base 8 basta ricordare la definizione:
ad es.
5 1 5 ( in base 8) vale in base 10:
5*100 + 1*10 + 5*1
(in base 8)
5 * 64 + 1 * 8 + 5*1
(in base 10)
= 320 + 8
+5
= 333
(in base 10)
51
rappresentazione di numeri
ancora un es:
il numero 3 7 1 3 in base 8 diventa in base 10:
3 * 1000 + 7 * 100 + 1 * 10 + 3 * 1
tutto in base 8, che in base 10 diventa:
= 3*512 + 7 * 64 + 1 * 8 + 3 * 1
= 1536 + 448
+ 8
+ 3
= 1995 10
52
rappresentazione di numeri
53
un es. in base 3 ... (cifre 0,1,2 ):
ricorda come si conta in base tre:
0
1
2
100 101 102
200 201 202
1000 …
10
110
210
11
111
211
12
112
212
20
120
220
21 22
121 122
221 222
che corrispondono ai numeri in base 10:
0
9
18
27
1
10
19
…
2
11
20
3
12
21
4
13
22
5
14
23
6
15
24
7
16
25
8
17
26
quanto vale 1 2 2 1 0 1 (dato in base 3) = in base dieci ?
rappresentazione di numeri
54
quanto vale 1 2 2 1 0 1 (dato in base 3) = in base dieci ?
ricorda come si conta in base tre:
0
1
2
10
11
12
0
1
2
3
4
5
20 che sono i numeri
6 in base 10
122101=
in base tre il significato e' noto:
1 * 100000 + 2* 10000 + 2 * 1000 + 1 * 100 + 0 * 10 + 1 * 1
che diventa in base dieci:
1 * 243 + 2 * 81
+ 2 * 27
= 243 + 162
+ 54
= 469 10 = 122101 3
+ 1*9
+9
+ 0 * 3 + 1* 1
+1
rappresentazione di numeri
In base due abbiamo due cifre 0 1
(cifre binarie,BInary digiT = BIT)
per rappresentare i due numeri zero e uno, e 10 per
rappresentare il numero due; i primi 20 numeri in binario:
1
1
11
10112
2
102
12
11002
3
112
13
1101
4
100
14
1110
5
101
15
1111
6
110
16
10000
7
111
17
10001
8
1000
18
10010
9
1001
19
10011
10
10102
20
101002
nota: 101 = 4 +1=5; 110 = 4+2=6; 1101 = 8+4+1=13 ecc
55
rappresentazione di numeri
ricorda alcune potenze di due in binario:
2 = 2 alla 1;
8 = due alla 3;
32 = 2 alla 5;
128 = due alla 7;
512 = 2 alla 9;
4= 2 alla 2;
16 = 2 alla 4;
64 = 2 alla 6;
256 = 2 alla 8;
1024 = 2 alla 10 ... = 1 Kilo
1 048 576 = 2 alla 20
= 1 Mega
1 073 741 824 = 2 alla 30 = 1 Giga
in base due scrivo:
2 ->102
4->100 2
8->1000 2
16->10000 2
32->10 00002 64->100 0000 2 128->1000 0000 2
256->1 0000 0000 2 ecc
56
rappresentazione di numeri
57
es. il numero
1011012
rappresenta (tutto in binario):
1*1000002 + 0*100002 + 1*10002 + 1*1002 + 0 *102 + 12
ovvero (in decimale):
1* 3210
= 4510
+ 0*1610
+ 1* 810
+ 1 * 410 + 0 * 210 + 1
rappresentazione di numeri
58
conversione da base 2 a base 10 -basta ricordare le potenze
di due ed il significato del codice,
4096 2048 1024 512 256 128 64
32 16
8
2^12 2^11 2^10 2^9 2^8 2^7 2^6 2^5 2^4 2^3
4
2
2^2 2^1
1
2^0
ad es 10000 2 = 2 alla 4 = 16
per cui 10100 = 1*2^4 +0*2^3 +1*2^2 +0*2^1 +0*2^0
rappresenta
1*16 +0*8
+1*4 +0*2
+0*1 = 20
esercizio ... convertire in base dieci il numero dato in base
due (qui inseriti tre spazi per migliore lettura):
101 0110 0110 01012
rappresentazione di numeri
59
soluzione esercizio
convertire in base dieci il numero dato in base due (qui
inseriti tre spazi per migliore lettura):
101 0110 0110 0101
ottengo (raggruppando a 4 a 4 i bit, e ricordando i pesi di
questi gruppi, che sono: 1 per l’ultimo a destra, 16 per il
penultimo a destra, 256 per il terzultimo a destra (il secondo)
e infine 4096 per il primo (un gruppo = 4 cifre binarie),
quindi (in notazione mista):
101*4096 + 0110*256 + 0110*16 + 0101*1
ricordando la tabellina dei primi 16 numeri in binario,
101 = 5, 0110 = 6, 0101 = 5, quindi:
5*4096 + 6*256 + 6*16 + 5 = 20480 + 1536 + 96 + 5 = 22117
esercizio (quiz)
quale numero segue nella sequenza, e perche' ?
(ovvero: come e’ costruita questa sequenza?)
10 11 12 13 14 20 22 101 ?
60
rappresentazione di numeri - tabella di corrispondenza
num\base
2
3
4
5
6
7
----------------------------------------------------------------------------------------
uno
1
1
1
1
1
1
due
10
2
2
2
2
2
tre
11
10
3
3
3
3
quattro
100
11
10
4
4
cinque
101
12
11
10
5
sei
110
20
12
11
10
sette
111
21
13
12
11
otto
1000 22
20
13
12
nove
1001 23
21
14
13
dieci
1010 101
22
20
14
61
nota: in base 4
quattro scrivo 10,
cinque scrivo 11
ecc
nota la diagonale
4 in tabella in cor5 rispondenza della
6 riga = colonna =
base,
10 e le diagonali
11 immediatam.
sopra e sotto...
12
13
rappresentazione di numeri
62
aritmetica elementare, date tabelle di addizione base 2 e 3 :
0 1
0 1 2
------------0 0 1
0 0 1 2
1 1 10
1 1 2 10
2 2 10 11
0+1=1 1+1=10 (binario)
1+1=2 2+1=10 (ternario)
da cui le somme in base 2,3,10 (stessi dati in basi diverse):
1 1 0 1
1 1 1
1 3
+
1 0
+
2
+
2
--------------1 1 1 1
1 2 0
1 5
2
3
10
rappresentazione di numeri ... ancora somme:
nove piu' cinque (decimale) in base 2 e 3:
1 0 0 1
1 0 1
------1 1 1 0
2
1 0 0
1 2
----1 1 2
9
5
-14
3
10
----------------------------------------------------------------------------------------------------
undici e cinque (decimale):
1 0 1 1
1 0 2
11
1 0 1
1 2
5
-----------1 0 0 0 0
1 2 1
16
2
3
10
-
63
rappresentazione di numeri ... ancora somme:
quindici piu' uno (decimale) in binario
e ternario :
1 1 1 1
1
-------1 0 0 0 0
2
1 2 0
1
----1 2 1
3
15
1
-16
10
64
rappresentazione di numeri
65
addizione in base otto
-----------------------------------------------------
0
1
2
3
4
5
6
7
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 10
6 7 10 11
7 10 11 12
1 5
+ 2
--1 7
8
13
+ 2
-15
10
4
5
6
7
10
11
12
13
5
6
7
10
11
12
13
14
6
7
10
11
12
13
14
15
1 3
5
--2 0
8
7
10
11
12
13
14
15
16
da cui ad
es. 7+1=10
11
5
-16
10
ottale /
decimale
rappresentazione di numeri
PRODOTTO: base 2 e 3:
0 1
--0 0 0
1 0 1
0 1
2
----------0 0 0
0
1 0 1
2
2 0 2 11
base 2
1*0=0
1*1=1
base tre
1*2 = 2
2*2 =11
66
rappresentazione di numeri
PRODOTTO:base 2 e 3:
0 1
---
0
1
2
---------
0 0 0
0 0
0
0
1 0 1
1 0
1
2
2 0
2 11
67
es. (12*13=156)
in base due:
1 1 0 0 * 1 1 0 1
-----------------1 1 0 0
1 1 0 0
0 0 0 0
1 1 0 0
--------------1 0 0 1 1 1 0 0
in base 10:
128 +16+8+4 = 156
rappresentazione di numeri
PRODOTTO: base 2 e 3:
0 1
--0 0 0
1 0 1
0 1 2
----------0 0 0 0
1 0 1 2
2 0 2 11
base 2
1*0=0
1*1=1
base tre
1*2 = 2
2*2 =11
68
base 3
[ 12*16=192 ]
1 1 0 * 1 2 1
---------------1 1 0
2 2 0
1 1 0
----------2 1 0 1 0
che e'
2*81+1*27+0*9+1*3+0*1 =
=162+27+3 = 192
esercizio: prodotto
69
esercizio: calcolare 18 * 5 in base due
( 18 * 5 = 9 * 10 = 90 in base 10,
in base 2: 90 = 64 + 16 + 8 + 2 =
= 1*64 + 0*32 +1*16 +1*8 +0*4 +1*2 + 0*1
ovvero
1 0 1 1 0 1 0
con i pesi
64 32 16 8 4 2 1 )
se passo prima in binario, e poi faccio il prodotto in binario:
18 = 16 + 2 = (in base 2) = 10000 + 10 = 10010
5 = 4 + 1 = (in base 2) = 101
cont.esercizio prodotto
70
continua esercizio: calcolare 18 * 5 in base due
18 = 16 + 2 = (in base 2) = 10000 + 10 = 10010
5 = 4 + 1 = (in base 2) = 101
quindi
10010 x 101
-----------1 0 0 1 0
0 0 0 0 0
1 0 0 1 0
---------------------1 0 1 1 0 1 0 =
64 + 16 + 8 + 2
rappresentazione di numeri
tavola delle moltiplicazioni
in base otto:
PRODOTTO: 2*4=10,3*5=17
1
2 3
4 5
6
7
-------------------------0 0
0 0
0 0
0
0
1 1
2 3
4 5
6
7
2 2
4 6 10 12 14 16
3 3
6 11 14 17 22 25
4 4 10 14 20 24 30 34
5 5 12 17 24 31 36 43
6 6 14 22 30 36 44 52
7 7 16 25 34 43 52 61
==========================
71
1 4 * 1 5
------(base 8)
1 4
7 4 (o)
-----2 3 4
(o) nb:
4*58=248 ho 48,
riporto 28,poi
1*58=5+2(rip)=7..
(in base 10:
12 * 13 =
36
------156
esadecimale (base 16)
72
In base 16 si usano 16 cifre, normalmente indicate con:
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
leggi: zero, uno, .. nove, dieci, undici, dodici, ... quindici)
I primi 20 numeri in base 16 sono(base10/base16):
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
A
base 10
base 16
11 12 13 14 15 16 17 18 19
B C D E F 10 11 12 13
20
14
base 10
base 16
esercizi: 1) quanto vale C * D in base 16 ?
2) costruire la tabella di moltiplicaz. per base 16.
CAMBIO DI RAPPRESENTAZIONE
(rip.) per decodificare in base 10 un numero scritto in una
base generica e' sufficiente ricordare la definizione. Es:
dato (in binario):
1 0 0 0
7 6 5 4
128 64 32 16
=
=
1*2^7 +
+
1*128 +
+
1 1
3 2
8 4
0*2^6
1*2^2
0*64
1*4
+
+
+
+
1 1 (cifre)
1 0 (rango)
2 1 (peso)
.. 1^2^3
1*2^1 + 1*2^0 =
.. + 1*8
1*2
+ 1*1
= 143
anche cosi':
= ((( ((( 1*2+0)*2+0)*2+0)*2 +1)*2+1)*2+1)*2+1
dove il primo 1 viene moltiplicato per 2^7, il secondo (zero)
per 2^6 ecc
73
CAMBIO DI RAPPRESENTAZIONE - dal BINARIO->
74
Raggruppando le cifre binarie (bit) a tre a tre, partendo da
destra verso sinistra, si converte la rappresentazione da base
due a base otto:
il dato di partenza 143 (base 10) ovvero in base due
10 00 11 11 vale (cifre bin. a tre a tre):
010 001 111
(1*2+0) * 2^6 +
= 2 * 64
= 2 * 8^2
(0*4+0*2+1) * 2^3 +
+ 1 * 8
+ 1 * 8^1
(1*4+1*2+1) * 2^0
+ 7 *1
=
+ 7 * 8^0 = 2 1 7
in base 8, che vale
= 2 * 64 + 1 * 8 + 7 = 128 + 8 + 7 = 143 in base dieci
CAMBIO DI RAPPRESENTAZIONE - dal BINARIO->
75
per passare da base due a base sedici e' sufficiente
raggruppare i bit a quattro a quattro:
lo stesso dato 143 che in base due si scrive: 10 00 11 11
vale
1000 1111
(1*8+0*4+0*2+0) * 2^4 +
= 8 * 16 + 15 * 1 =
= 8 F in base sedici
(1*8+1*4+1*2+1*0) * 2^0
= 8 * 16 + 15
= 128 + 15 = 143 in base 10
NOTA: l’esadecimale si usa solo come rappresentazione piu’
concisa del binario [ raggruppiamo il binario a 4 a 4 cifre
partendo da destra e abbiamo l’ esadecimale ]
.. il binario perche’ e’ usato dal calcolatore ...
CAMBIO DI RAPPRESENTAZIONE
Ricordiamo ancora la tabella di
corrispondenza dei codici
numerici da 1 a 15 nelle basi
(10)(16)(8)(2):
0 0 0 000
8 8 10 1000
1 1 1 001
9 9 11 1001
2 2 2 010
10 A 12 1010
3 3 3 011
11 B 13 1011
4 4 4 100
12 C 14 1100
5 5 5 101
13 D 15 1101
6 6 6 110
14 E 16 1110
7 7 7 111
15 F 17 1111
________________________________
76
il numero 10
(base 10) in base
otto si scrive 12, e
in base 2 si scrive
1010;
il numero 14 in
base 8 e' 16 e in
base 2 e' 1110
...
RAPPRESENTAZIONE BIN ... ultimi 4 esempi ...
77
- due es da base 2 a base 8 o 16:
per passare da base 2 a base 8 prendo i bit a tre a tre,
da base 2 a base 16 prendo i bita a 4 a 4
(sempre da destra verso sinistra):
dato 10 00 11 11 =
= 10 001 111 = 2 1 7 base 8
= 1000 1111 = 8 F base 16
nota: il raggruppamento
inizia da destra verso sin.
dato 10 10 10 10 10 =
= 1 010 101 010 = 1 2 5 2 base 8, bit a tre a tre;
=
10 1010 1010 = 2 A A base 16, bit a 4 a quattro
RAPPRESENTAZIONE BIN ... ultimi 4 esempi ...
... e due es. da base 16 a base 8 (uso base 2):
7B5C
dato in base 16 =
= 0111 1011 0101 1100 cambio raggruppamento:
= 0 111 101 101 011 100
= 0 7
5
5 3 4 (in base 8)
1991 dato in base 16 =
= 0001 1001 1001 0001 cambio raggruppamento:
= 0 001 100 110 010 001
= 0 1
4
6
2
1 (in base 8)
78
CAMBIO DI RAPPRESENTAZIONE DA DECIMALE ... 79
procedimento per passare da base 10 ad altra base: richiede
un po' piu' lavoro, ma e' ancora basato sulla definizione:
L'ultima cifra di un codice numerico posizionale in
base b e' sempre il resto della divisione per b
[“cio’ che resta dopo aver raggruppato gli oggetti a b
a b"],
quindi: dato un numero in base 10 ad es. 152,
l'ultima cifra "a" della sua rappresentazione in base b ,
...fedcba, e' data da (13 MOD 5 = resto di 13 diviso 5 = 3 !!):
n MOD b = 152 MOD b = (...fedcba) MOD b = a
ad es. se b=8 allora la cifra a = n MOD 8;
CAMBIO DI RAPPRESENTAZIONE DA DECIMALE ... 80
(ripeto..) dato numero n in base 10, l'ultima cifra "a" della sua
rappresentazione in base b , ...fedcba, e' data dal resto della divisione di
n per la nuova base b:
n MOD b = (...fedcba) MOD b = a
per passare da codifica da base 10 (es. 152) in base 8, calcolo
le singole cifre (dall'ultima in poi) dividendo ripetutamente
(ad ogni passo prendo come dividendo il quoziente del passo
precedente) per la base nuova (qui otto) e mi segno i resti
(ottengo per prima l'ultima cifra)
152 = 19 * 8 + 0 ->
19 = 2 * 8 + 3 ->
2 = 0 * 8 + 2 ->
0 = 0 * 8 + 0 ->
a questo punto smetto,
quindi 15210 = 2308
resto
resto
resto
resto
0
3
2
0
->
->
->
->
"a"
"b"
"c"
"d"
=0,
=3,
=2,
=0,
CAMBIO DI RAPPRESENTAZIONE DA DECIMALE ... 81
ancora, lo stesso dato in base 4:
152
38
9
2
0
= 38 * 4 + 0
= 9 * 4 + 2
= 2 * 4 + 1
= 0 * 4 + 2
= 0 * 4 + 0
quindi
152
10
= 2120
4
->
->
->
->
->
resto
resto
resto
resto
resto
0
2
1
2
0
->
->
->
->
->
"a"
"b"
"c"
"d"
"e"
=
=
=
=
=
0,
2,
1,
2,
0,
... ricordiamo che era:
152 = 230
10
8
verifica (da ottale in base 4, passando per il binario):
2 3 0 = 010 011 000 = 0 10 01 10 00 = 2120
8
2
2
4
esercizi:
82
calcolare 11011 + 110111 in base 2 <<<
quanto fa 322 + 123 in base 4 ?
quanto fa 322 + 123 in base 5 ?
<<<
quanto fa 304 + 552 in base 6 ?
calcolare 701 + 77 in base 8
calcolare 1202 x 22 in base 3
<<<
calcolare 11 011 + 110 111 in base 2
1 1 0 1 1 addendo
1 1 0 1 1 1 addendo
------------ passo 1
1 0 1 1 0 0 somme1
1 1 1 riporti1
1 0 1 1 0 0 somme2
1 1 1 riporti2
------------ passo 2
0 0 1 0 1 0 somme3
1 0 0 1 0 0 riporti 3
0 0 1 0 1 0 somme3
1 0 0 1 0 0 riporti 3
------------ passo 3
1 0 0 0 0 1 0 somme4
1
riporti4
1 0 0 0 0 1 0 somme4
1
riporti4
------------ passo 4
1 0 1 0 0 1 0 somma finale
riporti finali
verifica: 110112 = 16+8+3=2710 ; 110 111 = 32+16+7=5510 ;
27+55= 8210 ;
8210 = 64+16+2=1 010 010
83
quanto fa 322 + 123 in base 4 ?
322
1 2 3 (n.b: 2+3=11) |
-----| in breve:
0 0 1 somme parziali | 3 2 2
1 1 1 riporti
| 123
-----| ------1 1 1 0 somma finale | 1 1 1 1
quanto fa 322 + 123 in base 5 ?
in breve:
322
123
-----1000
84
85
quanto fa 304 + 552 in base 6 ?
304
552
1300
Ricorda:
3+5=12 (in base 6), scrivo 2 riporto 1 …
4+2 = 6 (in base 6), quindi 10, scrivo 0 riporto 1
86
calcolare 701 + 77 in base 8
701
77
1000
calcolare 1202 x 22 in base 3
1202x22
10111
10111
111221
esercizi
87
verificare:
1)
1984 (base 10)
= 2201111 (base 3)
= 3700
(in base 8)
2)
2576 in base 8
= 010101111110 (in base 2)
3)
14 + 15
4)
C*D
=
=
31 (base 8)
9C (base 16)
(segue soluzione)
1a) 1984 (base 10) = 2201111 (base 3)
1984/3 = 661 resto 1
18
04 661/3 = 220 resto 1
1 6
01 220/3 = 73 resto 1
10
1 73/3 = 24 resto 1
13
1 24/3 = 8 resto 0
0
8/3 = 2 resto 2
verifica:
2
2201111 3 vale in base 10:
2/3 = 0 resto 2
(((((2*3+2)*3+0)*3+1)*3+1)*3+1)*3+1=
(((( 8*3+0)*3+1)*3+1)*3+1)*3+1=
((( 24*3+1)*3+1)*3+1)*3+1= ((73*3+1)*3+1)*3+1 =
(220*3+1)*3+1 = 661*3+1= 1983+1 = 1984
88
esercizi
89
1b) 1984 (base 10) = 3700 (in base 8)
1984/8 = 248, resto 0
38
64 248/8 = 31, resto 0
0
31/8 = 3, resto 7
3/8 = 0,
resto 3
Verifica:
3*8^3 + 7*8^2 +0 +0 = 3*512 + 7*64
= 1536 + 448 = 1984
esercizi
2)
2576 in base 8
90
= 010101111110 (in base 2)
basta espandere le cifre ottali in gruppi di 3 bit,
Ricordando la tabellina di corrispondenza binario - ottale:
0
1
2
3
4
5
6
7
000
001
010
011
100
101
110
111
da cui:
2 5 7 6
010 101 111 110
che e' il risultato richiesto ..
esercizi
3) 14 + 15
91
=
31 (base 8) .. ricorda la tabella di addizione
-------------------------- da cui:
0|0 1 2 3 4 5 6 7
14
1 | 1 2 3 4 5 6 7 10 + 1 5
2 | 2 3 4 5 6 7 10 11 -----3 | 3 4 5 6 7 10 11 12
21
4 | 4 5 6 7 10 11 12 13
<-1
5 | 5 6 7 10 11 12 13 14 -----6 | 6 7 10 11 12 13 14 15
31
7 | 7 10 11 12 13 14 15 16
esercizi
92
4) C * D = 9C (base 16)
C = 12
D = 13
(ricorda: A=10, B=11, C=12, D=13, E=14, F=15)
12 * 13 =
-------12
36
-------156 10 =
15610, divido ripetutamente per 16:
156/16 = 9 (16*9= 144, 156-144=12=resto=C)
9/16=0, resto 9, quindi 15610 = 9C16
FRAZIONI
FRAZIONI
Come si interpreta in base 4 :
2321,0222
Oppure:
come si trasforma la codifica
39,71 da base 10 in base generica ?
93
FRAZIONI
Come si trasforma da base b1 a base b2 un dato numerico
con parte fratta non nulla - ad es.:
3 , 14 10 = xx , yy16 ?
Dalla definizione:
0,abcde... in base B
rappresenta il numero:
a
b
c
d
e
--- + --- + --- + --- + --- + ...
B
B^2
B^3
B^4
b^5
94
FRAZIONI
Cambio base:
29,45 = 29 + 0,45
per cambiare base trasformo separatamente
la parte intera e separatamente la parte fratta:
Per la parte intera sappiamo gia' come fare
29 (base 10) = xxx (base b)
Per la parte fratta:
0,45 = 0,abcdef... in altra base b ?
95
FRAZIONI
96
Per la parte fratta:
0,45 = 0,abcdef... in altra base b ?
ricorda la definizione:
0,45 = 4/10 + 5/100
... e :
0,abcde in base b significa ovviamente
a/10 + b/100 + c/1000 + d/10000 + e/100000
essendo 10, 100, 1000 ecc espressi nella nuova base,
ovvero b, b^2, b^3, ecc
FRAZIONI
97
Ancora:
0,5 in base 10 vale 0,1 in base 2 (un mezzo)
-- ovvero:
5/10 (base 10) = 1/10 (base 2) = 1/2 in base 10
quindi
0,510 = 0,12
Ancora:
0,125 in base 10 = 1/8 in base 10 = 1/100 in base 2
quindi
0,12510 = 0,0012
FRAZIONI
0,4510 = 0,abcdef... b da base 10 ad altra base b
procedimento per calcolare le cifre abcdef...
della parte fratta nella nuova base:
moltiplico entrambe le parti per b 0,xxx * b = 0,abcdef... * b
ottengo a sinistra e a destra una cifra intera,
y,zzz
= a,bcdef...
devono essere uguali sia la parte intera che la parte
fratta, separatamente, quindi ottengo la prima cifra
della parte fratta !
y = a
... e poi ripeto ...
98
conversione di base per frazioni
99
0,45 = 0,abcdef... conversione da base 10 a base 5
se moltiplico entrambe le parti per b :
0,45 * 5 = 0,abcdef... * 5
ottengo:
2,25
= a,bcdef...
devono essere separatamente uguali la parte intera e la
parte fratta, quindi
2 = a
ottengo la prima cifra della parte fratta moltiplicando il
dato di partenza (in base 10) per la base nuova b (qui
cinque);
ripeto con solo la parte fratta:
0,25 * 5 = 0,bcdef * 5 ottengo:
1,25
= b,cdef...
e quindi
1=b
conversione di base per frazioni
0,45 = 0,abcdef... conversione da base 10 a base 5
moltiplico ripetutamente entrambe le parti per b,
ad ogni passo ottengo una cifra della parte fratta in
base b, e poi ripeto con solo la parte fratta rimasta:
0,45 * 5 = 0,abcdef... * 5 ottengo:
2,25 = a,bcdef...
quindi a = 2; ripeto:
0,25 * 5 = 0,bcdef... * 5 ottengo:
1,25 = b,cdef...
e quindi b = 1; ripeto:
0,25 * 5 = 0,cdef... * 5 ottengo:
1,25 = c,def...
e quindi c = 1; ripetendo,
0,4510 = 0,211111... 5 in base 5 (periodico)
100
conversione di base per frazioni
101
2) esempio: trasformare 0,71 da base 10 in base 5,
cioe' trovare le cifre a,b,c,d,... della parte fratta in base 5.
0,71 = 0,abcdefg.. ==>> moltiplico ripetutamente per 5:
/ in base 10 \
/ parte in base 5 \
0,71 * 5 = 3,55 = a,bcdefg... quindi a = 3
0,55 * 5 = 2,75 = b,cdefg.... quindi b = 2
0,75 * 5 = 3,75 = c,defg..... quindi c = 3
0,75 * 5 = 3,75 = d,efg...... quindi d = 3
(periodico)
quindi
0,7110 = 0 , 3 2 3 3 3 35 cioe'
7
1
3
2
3
3
--- + --- = --- + --- + --- + --- + ...
10
100
5
25
125
625
nota: spesso ottengo un numero periodico nella nuova base!
conversione di base per frazioni
102
3) es.: trovare la rappresentazione di 0,45 (dato in base 10)
in base 8, ovvero trovare le cifre a,b,c,d,e,f,g, ... tali che
0,4510 = 0,abcdefg ... 8
Moltiplico per la base nuova ripetutamente
ParteFratta 0,45*8
0,6 *8
0,8 *8
0,4 *8
0,2 *8
0,6 *8
0,8 *8
=3,6
=4,8
=6,4
=3,2
=1,6
=4,8
=6,4
=
=
=
=
=
=
=
a,bcdefg->
b,cdefg...
c,defg...
d,efg...
e,fg...
f,g...
g,...
la sequenza 4 6 3 1 si ripete, quindi:
0,45 (base 10) = 0,3 4631 4631 4631 ...
a=3
b=4
c=6
d=3
e=1
f=4
g=6
nota sul cambio di base
103
Entrambi i procedimenti di conversione
(parte intera e parte fratta)
sono basati sul fatto che:
dividere (o moltiplicare) per la base b
significa
spostare la virgola (di base b) di una posizione
a sinistra (o a destra) (come ovvio in base 10);
Esempi in binario:
11 x 10 = 110 (3 x 2 = 6) 101 x 10 = 1010 (5 x 2 = 10)
110 x 10 = 1100 (6 x 2 = 12) 111 x 10 = 1110 (7 x 2 = 14)
1110 : 10 = 111 (14 : 2 = 7) 1010 : 2 = 101 (10 : 2 = 5 )
1000 : 10 = 100 (8 : 2 = 4) ecc
Note sul cambio base
104
Come si scrive
0,1 (base dieci)
in base due?
ovvero - se scrivo 1/10 in base due, lo scrivo in forma
di somma di termini 1/( 2^n ), con n=1,2,3,4, ovvero:
1/10 = a/2 + b/4 + c/8 + d/16 + …
quanto valgono a, b, c, d ecc?
vediamo …
105
come si scrive 1/10 (decimale) in base due?
0,110 = 0,abcde...2
dalla definizione, per la prime cifre della frazione:
1) moltiplico la equazione di sopra per due, e ottengo
(ricorda: moltiplicare per la base 2 significa spostare
la virgola binaria di una posizione a destra)
0,2 = a,bcde
devono essere separatamente uguali parte intera
qui zero, e quindi a=0, e la parte fratta, e quindi
resta:
0,2 = 0,bcde
2) ripeto per la parte fratta residua: moltiplico per
due e ho:
0,4 = b,cde
devono essere separatamente uguali parte intera
quindi b=0, e la parte fratta: 0,4 = 0,cde
0,110 = 0,abcde...2
per la prime cinque cifre della frazione:
1) moltiplico la equazione di sopra per due, e ottengo
0,2 = a,bcde
separatamente uguali parte intera quindi a=0,
e parte fratta, e quindi
resta 0,2 = 0,bcde
2) ripeto per la parte fratta residua: moltiplico per
due e ho: 0,4 = b,cde
devono essere separatamente uguali parte intera
quindi b=0, e la parte fratta: resta 0,4 = 0,cde
3) 0,4*2=0,8  c=0, resta 0,8 = 0,def..
4) 0,8*2=1,6  d=1, resta 0,6 = 0,ef..
5) 0,6*2=1,2  e=1, resta 0,2 = 0,f...
quindi le prime cinque cifre sono abcde = 00011
0,110 = 0,a bcde = 0,0 00112
rimane da calcolare 0,2 = 0,fghi che e' la stessa
situazione di 0,2 = a,bcde
106
quindi 1/10 (decimale) in base due
con moltiplicazioni per due ripetute: 0,1=
0,abcdefghi...
1)
2)
3)
4)
5)
6)
7)
8)
9)
0,1*2=0,2
0,2*2=0,4
0,4*2=0,8
0,8*2=1,6
0,6*2=1,2
0,2*2=0,4
0,4*2=0,8
0,8*2=1,6
0,6*2=1,2









a=0,
b=0,
c=0,
d=1,
e=1,
f=0,
g=0,
h=1,
i=1,
resta
resta
resta
resta
resta
resta
resta
resta
resta
0,2=
0,4=
0,8=
0,6=
0,2=
0,4=
0,8=
0,6=
0,2=
107
0,bcdefghi
0,cdefghi
0,defghi..
0,efghi...
0,fghi...
0,ghij...
0,hijk...
0,ijkl...
0,jklm...
0,110=0,a bcde fghi jklm
0,110=0,0 0011 0011 00112 la sequenza 0011 si ripete
all'infinito (frazione periodica), e quindi
0,110=0,0 0011 0011 0011 0011 0011 0011 ..2
come si scrive 1/10 (decimale) in base due?
abbiamo visto come si ricava 0,1 = 0,abcdefghi...
0,110= 0,0 0011 0011 0011 0011 0011 00112
con 5 addendi (approssimazione di 1/10 con 5 bit):
0.1=1/10 (base10) = 0/2 + 0/4 + 0/8 + 1/16 + 1/32 +
trascuto i termini seguenti + 0/64+0/128 + 1/256 + 1/512
+ 0/1024 + 0/2048 + 1/4096+..
e quindi 0/1010 = 0,000112 (approssimazione a 5 cifre) ->
0,000112
= 0,0625 + 0,03125 + 0,00390625 + 0,001953125 +
+ 0,00024414062
= 0,0998535...10 che e' DIVERSO da 0,1 !
108
come si scrive 1/10 (decimale) in base due?
109
passando da base 10 a base 2 la frazione 0,1 (1/10 in base 10)
diventa una frazione periodica ovvero con infinite cifre,
0,110= 0,0 0011 0011 0011 0011 0011 00112
0.1=1/10 (base10) = 1/16 + 1/32 + 1/256 + 1/512 + 1/4096+..
e quindi con 12 cifre binarie della frazione (5 addendi) :
0,000110011001 = 0,0625 + 0,03125 + 0,00390625 +
0,001953125 + 0,00024414062 = 0,099853516 ... non e' 0,110 !
.. e in generale con un numero limitato (es.24 cifre binarie)
ottengo una rappresentazione APPROSSIMATA di 0,1 
Si noti che 1/10 = 0,1 in base 10 NON e' rappresentabile
esattamente in base due con un numero finito di cifre, (si
DEVE fare un troncamento -> in ogni caso ho un errore !! )
frazioni
Anche la trasformazione opposta,
da base generica in base dieci,
si basa sulla definizione:
es per base 2:
dato 0,1011 in base due,
0,1011 = 1/2 + 0/4 + 1/8 + 1/16 ... in base 10,
quindi
= 0,5 + 0,0 +0,125 + 0,0625 =
= 0,6875 in base 10
110
es per base 16
frazioni
ricordiamo: ogni cifra esadecimale usa 4 bit;
il numero di bit usati per le potenze di 16:
1)1016 = 1610 = 16^1
......... 4
2)10016 = 25610 = 16^2 ......... 8
3)100016 = 409610 = 16^3 ...... 12
4)
65 536 = 16^4
........ 16
5)
1048 576,
..... 20 (un mega)
6)
16 777 216, ..... 24
7)
268 435 456,
... 28
8)
4 294 967 296, ... 32 (4 giga)
...per scrivere un valore di 4G devo usare
32 bit (per avere un indirizzo di 4G devo
usare 32 bit; ritorneremo su questo in HW
111
frazioni
es 0,5A5116
112
(4 cifre esadecimali = 16 bit)
= 5/1610 + 10/25610 + 5/409610 + 1/6553610
= 0,312510 + 0,039062510
+ 0,001220703110 + 0,000015258789..
= 0,35278320312.. 10
(qui, conversione da base 16 a base 10, il numero di
cifre in base 10 e' finito o no? ;-)
frazioni
113
quando si converte una frazione con un n umero di cifre
limitato da base generica a base dieci,
il calcolo da fare e' la somma di termini del tipo
k/ ( b ^ n )
dove 1/b^n in genere NON e' rappresentabile con un numero
di cifre finito in base 10, es. banale:
1/3 = 0,33333...
.....................................
MA per le basi 2,4,8,16, eccetera
1/(b^n)
( con b 2 oppure 4 oppure 8 ecc )
e' sempre rappresentabile esattamente con un numero di
cifre finito ... basti pensare alla sequenza
0,5 0,25 0,125 0,0625 0,03125 ecc
frazioni
114
nota:
una frazione con un numero fisso di cifre in binario si
converte sempre in una frazione in decimale con un numero
di cifre limitato, perche' 1/(2^k) ovvero ½, ¼, 1/8, 1/16, 1/32
ecc hanno un numero di cifre decimali limitato:
1/2 0,5
1/128 0,0078125
1/4 0,25
1/256 0,00390625
1/8 0,125
1/512 0,001953125
1/16 0,0625
1/1024 0,0009765625
1/32 0,03125
1/2048 0,00048828125
1/64 0,015625
1/4096 0,000244140625
1/n 0,000..abcd..gh25
limiti
rappresentazione dei numeri
NEL calcolatore:
i limiti dei formati standard (fissi)
115
limiti della codifica nel calcolatore
in un calcolatore i numeri sono codificati in binario con un
numero fisso di bit (una potenza di 2: 8, 16, 32, 64, 96) e solo un numero limitato di interi e' rappresentabile.
Ad esempio, gli interi sono rappresentati con (*)
8 bit, da 0 a
255 oppure da -128 a +127
(in C: short int) (+)
16 bit da 0 a 65 535 oppure da -32 768 a 32 767
(in C: int)
32 bit, da 0 a 4 294 967 295 oppure da -2G a + 2G,
(in C: long int)
64 bit, long long int
80 bit ... ecc
________________________________________________________________________________________________
(*) 4 bit: 0..15; 8 bit: 0..255; 10 bit: 0..1023; 12 bit: 0..4095,..
(+) int, short int = nomi di tipi di variabili nel linguaggio
di programmazione C
116
limiti della codifica nel calcolatore
117
con 4 bit, sono rappresentabili 16 numeri senza segno:
00
00
00
00
00
01
10
11
=0
=1
=2
=3
01
01
01
01
00
01
10
11
=4
=5
=6
=7
10
10
10
10
00
01
10
11
=8
=9
=10
=11
11
11
11
11
00=12
01=13
10=14
11=15
e i numeri da 16 in poi NON sono piu' rappresentabili.
se uso sempre 4 bit, un'operazione aritmetica puo' dare un
risultato non rappresentabile con tale formato:
1010
+ 111
----------
10001
ovvero
10
+7
--------
17
il risultato esce dall' insieme dei numeri rappresentabili, ->
errore di troncamento o traboccamento = "overflow"
limiti della codifica nel calcolatore
118
Analogamente (o peggio) per le frazioni:
ricordiamo solo il numero 1/1010, cioe'
0,110= 0,0 0011 0011 0011 0011 0011 0011...2
0,1=1/10 (base10) = 1/16 + 1/32 + 1/256 + 1/512 + 1/4096+..
e quindi con 12 cifre binarie dopo la virgola ( 5 addendi )
0,0001 1001 1001 = 0,0625 + 0,03125 + 0,00390625 +
+ 0,001953125 + 0,00024414062
= 0,099853516 che e' diverso dal dato 0,1 !!
con formato fisso di 8 bit la rappresentazione di 0,1 diventa:
0,0001 1001 = 1/16 + 1/32 + 1/256 =
0,0625+ 0,03125+ 0,00390625 = 0,09765625
che e' anora peggio (piu' diverso da 0,1) !
119
rappresentazione di
numeri con segno
RAPPRESENTAZIONE DI NUMERI CON SEGNO
con 3 bit rappresento 8 oggetti diversi,
(ad esempio con 3 bit posso contare fino a 7, quindi
rappresento otto numeri da 0 a 9);
finora abbiamo visto la codifica per numeri senza segno,
ma posso rappresentare con gli stessi codici anche numeri
negativi,
di solito si associa la meta' dei codici ai numeri positivi, e
meta' dei codici ai numeri negativi:
ad esempio con 2 bit ho:
00 = 0 01 = 1 10 = 2 11 = 3
oppure
00 = 0 01 = 1 10 = -1 11 = -1
120
121
RAPPRESENTAZIONE DI NUMERI CON SEGNO
con 3 bit rappresento 8 oggetti diversi, (es.otto numeri);
posso rappresentare con gli stessi codici anche numeri negativi,
(di solito meta' codici per positivi, meta' per negativi),
come in figura:
000 0
000 -4
000 0
000 -1
001 1
001 -3
001 1
001 -2
010 2
010 -2
010 -1
010 -3
011 3
011 -1
011 2
011 -4
100 4
100 0
100 -2
100 0
101 5
101 1
101 3
101 1
110 6
110 2
110 -3
110 2
111 7
111 3
111 4
111 3
senza
con
con
con
segno
segno/a
segno/b
segno/c
... in quanti modi posso associare 8 simboli a 8 codifiche?
... in quanti modi posso associare 8 simboli a 8 codifiche?
quante codifiche binarie diverse posso avere per 8
simboli ? dati 8 simboli ( a, b, c, d, e, f, g, h ),
dati 8 codici binari a 3 bit, es.
( 111 110 101 100 011 010 001 000 )
posso associare al primo simbolo a uno qualunque dei 8
codici a 3 bit, ad es. a = 011 (A) (8 scelte possibili);
al secondo simbolo posso associare uno qualunque dei 7
codici rimasti, ad es. b = 110 (B) in totale per i primi due
simboli posso fare 8*7 scelte per le due codifiche:
a, b, c, d, e, f, g, h
(A)
(B)
111 110 101 100 011 010 001 000
122
... in quanti modi posso associare 8 simboli a 8 codifiche?
123
dati 8 simboli ( a, b, c, d, e, f, g, h ), dati 8 codici binari
a 3 bit, ( 111 110 101 100 011 010 001 000 )
posso associare al primo simbolo "a" uno qualunque dei 8
codici a 3 bit, ad es. a = 011 (8 scelte possibili);
al secondo simbolo "b" posso associare uno qualunque dei 7
codici rimasti, ad es. b = 110, (7 scelte);
al terzo simbolo "c" posso associare un codice dei 6 codici
rimasti, es. c= 000 (6 scelte)
poi 5 scelte per il quarto, 4 scelte per il quinto simbolo,
in totale per 8 simboli posso fare 8*7*6*5*4*3*2*1 scelte;
per 8 simboli con un codice a 3 bit posso fare 8 !
(8 fattoriale) scelte, cioe' 40320 scelte.
Codifica numeri interi con segno
124
Dati 8 codici binari posso scegliere 8! modi per usarli nella
rappresentazione di 8 numeri interi con segno, meta' positivi
e meta' negativi (qui 5 dei 8! possibili codici diversi )
codice num1 num2 num3 num4 num5 …
0
1
2
3
4
5
6
7
000
001
010
011
100
101
110
111
-3
-2
-1
-0
+1
+2
+3
+4
-4
-3
-2
-1
0
1
2
3
3
2
1
0
-1
-2
-3
-4
0 0
1 -0
2 1
3 -1
-3 2
-2 -3
-1 3
-0 -4
cont. RAPPRESENTAZIONE DI NUMERI CON SEGNO
125
per rappresentare numeri negativi con n bit (ad es. 4 bit),
uso delle regole convenzionali di rappresentazione;
caso piu' semplice: un bit per il segno, il resto rimane uguale;
2 possibilita’: rappresento segno meno con bit 1 o con bit 0:
000 0 +0
-0
001 1 +1
-1
RAPPRESENTAZIONE :
010 2 +2
-2
GRANDEZZA CON UN BIT
011 3 +3
-3
PER IL SEGNO
100 4 -0
+0
101 5 -1
+1
questa codifica non e’ usata ;-)
110 6 -2
+2
111 7 -3
+3
vediamo ora le 3 codifiche piu’ usate per i numeri con segno:
complemento a uno, complemento a due, con eccesso di 2^(k-1)
numeri con segno : il complemento a uno
0
1
2
3
4
5
6
7
000
001
010
011
100
101
110
111
+0
+1
+2
+3
-3
-2 <--1
-0
126
RAPPRESENTAZIONE
DI NUMERI CON SEGNO
IN COMPLEMENTO A UNO
QUI CON 3 BIT + 1 BIT SEGNO
in complemento a uno la codifica di un numero negativo si
ottiene scambiando uni e zeri, rango per rango, ovvero
facendo il complemento bit per bit:
codice di +2 = 0 10 -->> cod.di -2 = 1 01
dove il primo bit e’ il bit del segno, gli altri codificano il num
numeri con segno : il complemento a uno
in complemento a uno la codifica di un numero negativo
si ottiene scambiando uni e zeri, rango per rango, ovvero
facendo il complemento bit per bit:
il primo bit e’ il bit del segno,
gli altri codificano il numero
0
1
2
3
4
5
6
7
000
001
010
011
100
101
110
111
+0
+1
+2
+3
-3
-2 <--1
-0
codice +2 = 0 10
codice -2 = 1 01
codice +3 = 0 11
codice -3 = 1 00
127
numeri con segno : il complemento a uno
128
in complemento a uno: -x e' rappresentato con il
complemento di x bit per bit, cioe' da: (2 n -1) -x (*)
-5 in un codice a 4 bit in complemento a uno e’ dato da:
(24 -1) -x = (16-1 -5) = (15 - 5)10 = (10000 - 1)2 - 1012 =
1111 - 0101 = 1010 = complemento bit per bit di 0101
-3 in un codice a 4 bit in complemento a uno e’ dato da:
(24-1) - x = (10000 -1 ) -3 =
1111 - 0011 = 1100 da cui la tabella gia’ vista..
(*) nota: se uso n bit, 2 n non e’ rappresentabile
ad es. se uso 3 bit, 2 3 = 8 = 1000 non e’ rappresentabile;
il numero piu’ grande rappresentabile con n bit e’ 2n -1,
che e' il codice con tutti i bit messi a 1
ad es. con 3 bit e’ 111 = 1000 - 1 = 8 - 1=7 )
numeri con segno : il complemento a uno
complemento a uno: -x e' rappresentato con il compl. di x
bit per bit, cioe' -x e’ rappresentato da (2 n -1) - x = 11..11 - x
es -5 con 4 bit in complemento a uno:
(2 4 -1) -x = (10000 - 1) - 5 = 1111 - 0101 = 1010
0
1
2
3
4
5
6
7
0
0
0
0
0
0
0
0
000
001
010
011
100
101
110
111
+0
+1
+2
+3
+4
+5
+6
+7
|
|
|
|
|
|
|
|
1
1
1
1
1
1
1
1
111
110
101
100
011
010
001
000
-0
-1
-2
-3
-4
-5
-6
-7
si noti: la codifica e’ simmetrica, i numeri rappresentabili
con 4 bit vanno da -7 a +7, vi sono due codifiche dello zero!
129
numeri con segno : il complemento a uno
con 4 bit (numero bit n=4) ho:
0 0 000
+0
|
1 111
-0
1 0 001
+1
|
1 110
-1
...
..
|
...
..
6 0 110
+6
|
1 001
-6
7 0 111
+7
|
1 000
-7
[n = 4, n-1 = 3 bit per il dato -> per i positivi da 0 a 7, per i
negativi, da - 0 a - 7] in generale in complemento a uno
con n bit rappresento i numeri da - (2n-1-1 ) a + (2n-1-1 )
il num. piu’ positivo x ha il codice (2n-1-1 ) = 23 -1 = 1000-1 = 0111 = 7,
il numero piu’ negativo e’ rappresentato (ha il codice) da
( 2n -1 - x) = ( (2n -1) - (2n-1 - 1 )) = (2n-1 +2n-1 -1) - (2n-1 -1 )) =
= 2n-1 + 2n-1 -1 - 2n-1 + 1 = 2n-1 -1 +1 =
= 2n-1 = ( se n=4) = 8 = 1000 = rappresentazione di -7...
130
numeri con segno : il complemento a uno
131
il codice (complemento a uno) di un dato negativo e' dato dai
bit del dato (positivo), complementati uno per uno:
0110 sei, 1001 meno sei,
0101 cinque, 1010 meno cinque
questo codice permette di fare l' ARITMETICA di numeri
con segno in modo semplice : 3 - 4 = -1
in codice binario con complemento a uno?
la rappresentazione in complemento a uno
e' consistente con le operazioni di aritmetica,
ovvero posso sommare i codici di un numero positivo e di un
numero negativo e ottenere il codice corretto del risultato.
vi sono tre casi da considerare a seconda dei riporti riguardo
il bit del segno (nessuno, uno, due riporti) ... vediamo ...
aritmetica in complemento a uno
132
la rappresentazione in complemento a uno e' consistente con
le opera- zioni di aritmetica: si sommano i codici dei numeri
con segno e e si ottiene il codice corretto del risultato:
due casi senza riporto al- o dal- bit del segno:
1) caso di risultato positivo
3+2 = +5
0011 3
0010 2
-------- -0101 5
-------------------------------------------------------------------------------------------------------------
2) caso di risultato negativo
3+ [(24-1)-4]= (24-1)-1 =
che e' la codifica di -1
3-4 = -1
0011 3
1 0 1 1 -4
-------- -1 1 1 0 -1
133
numeri con segno : il complemento a uno
aritmetica numeri con segno, caso con 2 riporti al/dal segno:
3) caso di risultato positivo
7-4=3
nota: codice di -4 =
24-1 –4 = 1111-0100
Quindi (24-1) + 7-4 =
24 -1 + 3 =
1
24
+ 2 =>
c'e' un riporto a sinistra, dal bit del segno,
il riporto si somma a destra,
ultimo rango a destra, con la
correzione otteniamo 1+2 = 3
0 1 1 1
1 0 1 1
------0 0 1 0
7
-4
-2
+ 1
------1 1
+1
-3
nota che c'e' un riporto anche NEL bit del segno:
vi sono due riporti !
numeri con segno : il complemento a uno
134
3) ancora: caso di risultato positivo 5 - 3 = 2
0 1 0 1
1 1 0 0
------1 0 0 0 1
1
-------1 0
5
-3
-+1
+1
-2
SOMMA DI NUMERI IN
COMPLEMENTO A
UNO:se vi sono due
riporti, uno al
bit del segno e
uno dal bit del
segno, il riporto
da sinistra (dal
segno) si somma a
destra
135
numeri con segno : il complemento a uno
4) caso di risultato negativo, senza riporti: 4-6=-2
se il risultato
e' negativo, e non
vi sono riporti ne'
nel bit del segno,
ne' dal bit del segno,
0 1 0 0
1 0 0 1
------1 1 0 1
allora otteniamo il risultato
direttamente dalla somma dei due
codici
4
-6
--2
136
5) caso di risultato negativo, due riporti:
-1-5 = codici di –1 e –5
in complemento a uno:
[(24-1)-1]+[(24-1)-5]=
[24+(24-1)-7 ] =
il riporto da sinistra
si somma a destra
-1 -5 = -6
1 1 1 0
1 0 1 0
------1 1 0 0 0
+1
--------1 0 0 1
-1
-5
--7
+1
--6
numeri con segno : il complemento a uno
nella somma di due numeri con segno codificati in
complemento a uno si hanno le regole seguenti (regole
realizzate dai circuiti elettronici dell'unita' aritmetica)
* nessun riporto nel / dal bit del segno  ok, niente da
aggiustare
* due riporti (nel/dal bit del segno)  ok, e il
riporto fuori del segno a sinistra si somma a
destra (rango delle unita')
e se c'e' un solo riporto (dal bit del segno oppure nel bit del
segno)  in tal caso il risultato NON e' corretto,
c'e' un errore di trabboccamento (overflow)
vediamo questi casi di risultato errato ...
137
numeri con segno : il complemento a uno
138
7) caso di overflow,dove il risultato NON
e’rappresentabile(un solo riporto al segno)
5
6
-11
0 1 0 1
0 1 1 0
------1 0 1 1
risultato si legge 5+6= -4
[[un solo riporto verso il
bit segno -> errore di
trabboccamento->overflow]]
8) caso di overflow
-5
-6
---11
1 0 1 0
1 0 0 1
-------1 0 0 1 1
[[un solo riporto dal bit
del segno -> errore
di overflow ]]
si ottiene: -5-6 = 3
numeri con segno, complemento a uno:
riassumendo, la codifica dei numeri con segno in
complemento a uno (num.negativi rappresentati dal codice
dei numeri positivi complementando i bit uno a uno)
e' un codice consistente con le operazioni aritmetiche, e
e' un codice simmetrico rispetto lo zero:
+6 codice 0 110
due zeri:
0 000
-6 codice 1 001
-0 codice 1 000
limiti simmetrici, per positivi e per negativi,
da 0 a (2^(n-1)) -1 , con n=4 bit il limite e' (2^3-1) cioe':
+7
0 111
-7 codice 1 111
139
numeri con segno, complemento a due:
una codifica oggi piu' usata:
numeri con segno in complemento a due:
e' simile alla codifica in complemento a uno,
ma
con i codici spostati di una posizione
e
con un solo codice per lo zero;
la rappresentazione di un numero negativo in
complemento a due e’ data dal complemento bit per
bit, e poi sommando uno:
+6
-6
codice di +6 e' 0 110,
codice di -6 e' 1 001 +1 = 1 010
140
numeri con segno, complemento a due:
141
un primo esempio con 3 bit per il codice con segno (un bit per il segno,
due bit per il dato)
codifica in compl.a uno | CODICE IN COMPLEM.A DUE:
0
1
2
3
4
5
6
7
000
001
010
011
100
101
110
111
+0
+1
+2
+3
-3
-2
-1
-0
|
|
|
|
|
|
|
|
000
001
010
011
100
101
110
111
+0
+1
+2
+3
-4
-3
-2
-1
<--
<--
la rappresentaz.e di un num. negativo in complemento a due
e’ data dal complemento bit per bit, e poi sommando uno:
+2 = 0 10 -> cod.di -2 = 1 01 +1 = 1 10 =
il primo bit e’ il bit del segno, gli altri codificano il numero
+3 = 0 11 -> cod.di -3 = 1 00 +1 = 1 01 =
-2
-3
RAPPRESENTAZIONE IN COMPLEMENTO A DUE
rappresento -x in complemento a due con (2 n - x )
(*)
ad es: -5 e' rappresentato da (24-5) = (10000 - 101) = ((10000 -1) +1 -101 ) =
(1111 - 101 +1) = 1010 + 1 = 1011
un dato negativo in complemento a due si
rappresenta con il codice:
{ [complemento bit per bit del dato] + uno }.
-5 codice ( complemento a uno: +5 e' 0101 quindi –5 e' 1010 )
codice in complemento a due: 1010+1 = 1 011
_____
(*) codice di –x in complemento a uno: ( 2 n -1 ) - x
142
RAPPRESENTAZIONE IN COMPLEMENTO A DUE
143
comlem. a due: -x e’ rappresentato da 2 n -x = 100..00 - x
-5 con 4 bit 2 4 -x = 10000 - 0101 = 1011
0
1
2
3
4
5
6
7
0
0
0
0
0
0
0
0
000
001
010
011
100
101
110
111
+0
+1
+2
+3
+4
+5
+6
+7
|
|
|
|
|
|
|
|
1
1
1
1
1
1
1
1
111
110
101
100
011
010
001
000
-1
-2
-3
-4
-5
-6
-7
-8
si noti: la codifica non e’ simmetrica, i num. rappresentabili
vanno da -8 a +7,
e c'e' una codifica dello zero!
RAPPRESENTAZIONE IN COMPLEMENTO A DUE
144
ripetendo ...
caso rappresentazione di numeri negativi in
codifica complemento a due :
-x e’ rappresentato da 2 n -x
i numeri rappresentabili con n bit vanno da..a :
-2 n-1 ... + 2 n-1 -1 (ad es. se n=4, da -8 a +7)
si noti che l' intervallo NON e' simmetrico!
e che
c'e' un unico codice per lo zero.
145
RAPPRESENTAZIONE IN COMPLEMENTO A DUE
codice a 6 bit, 5 bit dato (numeri da 0 a 31), 1 bit segno:
complemento a due :
31 0 11111 -32 1 00000
x = +10 codice 001 010,
30 0 11110 -31 1 00001
x = -10 codice?
29 0 11101 -30 1 00010
-x rappresentato da
28 0 11100 -29 1 00011
...
2 n -x = 2 n -1 -x+1 .. qui n=6,
17 0 10001 -18 1 01110
= 1000 000 - 1 –001010 + 1
16 0 10000 -17 1 01111
= 111111 – 001010 + 1
15 0 01111 -16 1 10000
= compl.bit per bit + 1
...
= 110 110
10 0 01010
...
2 0 00010
1 0 00001
0 0 00000
-10 1 10110
-3 1 11101
-2 1 11110
-1 1 11111
con 6 bit si rappresentano i
numeri da -32 a +31:
-2 n-1 = -2 5 = - 32 = 1 00000
+2 n-1 -1= 25 -1 = +31 = 0 11111
numeri negativi: codifica in complemento a due
-3
+2
--1
1 1 0 1
0 0 1 0
------1 1 1 1
146
ovvero: (2^4-3)+2= 2^4-1
che rappresenta -1
... per definizione
------------------------------------------------------------------
-2
+4
-+2
1 1 1 0
0 1 0 0
------1 0 0 1 0
ovvero (2^4-2)+4 = 2^4+2,
ignoro il riporto a sinist
che e’ dato da 2^4
[[n.b.: due riporti, uno
dal e uno nel bit segno]]
------------------------------------------------------------------
-3
-2
--5
1 1 0 1
1 1 1 0
------1 1 0 1 1
(2^4-3)+(2^4-2)=(2^4-5)+2^4
il riporto (2^4) ignorato[[n.b.: due riporti, uno
dal e uno nel bit segno]]
anche qui il risult. e' ok
numeri negativi: codifica in complemento a due
147
quando il risultato NON e’ rappresentabile:
5
6
-11
-5
-6
---11
0 1 0 1
0 1 1 0
------1 0 1 1
1 0 1 1
1 0 1 0
-------1 0 1 0 1
[[un solo riporto verso il
bit segno -> errore di
trabboccamento->overflow]]
[[un solo riporto dal bit
del segno -> errore
di overflow ]]
diversi modi di rappresentare numeri con segno:
a
0
0
0
0
0
0
b
000
011
100
101
110
111
c
=
=
=
=
=
=
d
0
3
4
5
6
7
a
1
1
1
1
1
1
1
1
b
000
001
010
011
100
101
110
111
c
=
=
=
=
=
=
=
=
d
8
9
10
11
12
13
14
15
148
(a = segno, b = cifre dato)
c = codifica senza segno
d = codifica in complemento a uno
e = codifica in comlemento a due
f = codifica in grandezza con segno
<-- fino qui(segno +)come noto,poi:
e
-7
-6
-5
-4
-3
-2
-1
-0
f
-8
-7
-6
-5
-4
-3
-2
-1
-0
-1
-2
-3
-4
-5
-6
-7
codifica complemento
a due (colonna e)
-5 si scrive: 1011
in compl. a uno (col. d)
-5 si scrive: 1010
in grandezza con segno
(colonna f)
-5 si scrive: 1101
cont. RAPPRESENTAZIONE DI NUMERI CON SEGNO
149
abbiamo visto le due codifiche piu’ usate per rappresentare i
numeri con segno,
codifica in complemento a uno
codifica in complemento a due
vediamo ora due codifiche derivate da queste,
“rappresentazione in eccesso di k”
usate nella rappresentazione dei numeri in virgola mobile
(tipo: 3,77 E-52 )
per la parte dell’esponente...
ancora 2 modi di rappresent. numeri con segno:
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
a
000
001
010
011
100
101
110
111
000
001
010
011
100
101
110
111
b
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
c
0-7
1-6
2-5
3-4
4-3
5-2
6-1
7-0
-8+0
-7+1
-6+2
-5+3
-4+4
-3+5
-2+6
-1+7
de
-8
-7
-6
-5
-4
-3
-2
-1
+0
+1
+2
+3
+4
+5
+6
+7
f
colonna:
a= segno,
b= bit per il dato,
c = decimale,
d = complemento a due
e = rappresentazione
in eccesso di 2^N
con complemento a uno
f = rappresentazione
in eccesso di 2^N
con complemento a due
num.positivi segno 1
nota che i numeri
negativi hanno il
bit del segno zero
150
rappresentaz. di numeri con segno con eccesso di k
151
codifica di numeri positivi e negativi con eccesso di 2n-1
ogni dato x (pos.o neg) e’ codificato con: 2(n-1) + x
(con n = numero bit della rappresentaz.)
ad es. per codificare 5 con n = 4 bit abbiamo:
5 -> 2(n-1) + 5 = 23 + 5 = 1000 + 101 = 1101
per rappresentare un numero negativo? -> uso l’aritmetica
con complemento; devo decidere quale rappresentazione
uso per la sottrazione, cioe’ quale codice per il -x; es:
-5 -> 23 - 5 = 1000 + [codice di -5] ->
ora, se rappresento -5 in complemento a uno allora:
2^3 + (-5) = 1000+1010 = 0010 (colonna d)
(ignoro il riporto dal rango del segno!)
codifica num.negativi con eccesso di k
con n bit rappresento x con
2(n-1) + x
con 4 bit ho i codici di +5 e di –5:
5 -> 2(n-1) + 5 = 23 + 5 = 1000 + 101 = 1101
-5 -> 23 - 5 = 1000 + codice di -5 ->
-5 codice con eccesso di 23, complem.a uno:
2^3 + (-5)= 1000 + 1010 = 0010 (colonna d)
-5 codice eccesso di 23, in complem.a due:
2^3 + (-5)= 1000 + 1011 = 0011 (colonna e)
il primo bit e'sempre il segno del dato; con la codifica
in eccesso di k il segno meno corrisp. al bit segno = 0
152
Riassunto 4 codifiche numeri interi con segno
riassumiamo la
rappresentazione di
numeri con segno le 4 codifiche,
caso di codice a 4 bit
(1 bit per segno, 4 bit per dato)
153
0
0
0
0
0
0
0
0
000
001
010
011
100
101
110
111
=
=
=
=
=
=
=
=
0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
7
-7
-6
-5
-4
-3
-2
-1
-0
-8
-7
-6
-5
-4
-3
-2
-1
c= codifica senza 154
segno
d= codice in complem
a uno (due zeri!)
la piu' usata:
e= codifica in complemento a due
(non simmetrica)
1
1
1
1
1
1
1
1
a
000
001
010
011
100
101
110
111
b
=
=
=
=
=
=
=
=
8
9
10
11
12
13
14
15
c
-7
-6
-5
-4
-3
-2
-1
-0
d
-8
-7
-6
-5
-4
-3
-2
-1
e
+0
+1
+2
+3
+4
+5
+6
+7
f
+0
+1
+2
+3
+4
+5
+6
+7
g
f= rappresentazione
in eccesso di 2N
con compl. a uno
g= rappresentazione
in eccesso di 2N,
con complem.a due
codifiche f,g hanno i
num.negat.con segno 0
esercizi aritmetica con segno:
1) esercizio:
calcolare la somma :
+3
-3
in due versioni,
complemento a uno
complemento a due
usare una codifica a 4 bit,
155
esercizi aritmetica con segno:
in complem. a uno
+3 -> 0 0 1 1
-3 -> 1 1 0 0
0 0 1 1
1 1 0 0
---------ottengo il codice di -0 1 1 1 1
(ricorda: il riporto da sinistra si somma a destra )
complemento a due: 3
-3
0 0 1 1
1 1 0 1
------------ (due riporti 1 0 0 0 0 ignoro riporti)
156
esercizi aritmetica in complemento a uno
es.2) calcolare in complemento a uno
con codice a 4 bit:
6 -4
5-6
-2 -3
157
esercizi aritmetica in complemento a uno
158
calcolare 6 - 4 (complemento a uno, codice a 4 bit) :
codice +6 0 110,
codice +4 0 100, -4 1 011, quindi
+6 0 110
somma : -4 1 011
----10 001 risultato - ma vi sono
due riporti al/dal segno, si somma il
riporto: 0 001
+1
----0 010
ottengo il codice di +2
esercizi aritmetica in complemento a uno
159
calcolare 5 - 6 (complemento a uno, codice a 4 bit):
codice di +5 0 101,
codice di +6 0 110, di -6 1 001,quindi
+5 0 101
somma : -6 1 001
-----1 1 110
nessun riporto al/dal segno, ho direttamente il
risultato meno uno
esercizi aritmetica in complemento a uno
calcolare -2 -3 (complemento a uno, codice a 4 bit)
codice di +2 0 010, di -2 1 101
codice di +3 0 011, di -3 1 100, quindi
-2 1 101
somma : -3 1 100
----11 001
due riporti al/dal segno, sommo il
riporto: 1 001
+1
----1 010 risultato codice di -5
160
esercizi aritmetica in complemento a uno
3) stessi esercizi, ma in complemento a due;
6 -4
5-6
-2 -3
ricorda per avere il codice di -3 in complemento a 2 si fa:
parto dal codice di +3, 0 011,
il complemento a uno e’ 1 100, a questo poi sommo uno,
e ottengo
1 101
che e' il codice di -3 in complemento a due;
(vale anche per lo zero: per avere il codice di -0 si fa:
+0 = 0 000, complemento a 1 e' 1 111,
1111 piu' 1 -> ottengo 0 000 )
161
esercizi aritmetica in complemento a due, codice a 4 bit
6 -4
codice di +6 0 110
codice di +4 0 100, -4: 1011 + 1 = 1 100
somma: +6 0 110
-4 1 100
----+2 10 010
risultato
0 010
(il doppio riporto in e dal bit del segno e' ignorato)
162
2) esercizi aritmetica in complemento a due con codice a 4 bit
5-6
codice di 5 0 101
codice +6 0 110,
di -6: 1 001+1=1010
somma:
+5 0 101
-6 1 010
---------1 1 111
-2 -3
codice di 2 0 010,
-2: 1101+1= 1 110
codice di 3 0 011,
-3: 1100+1= 1 101
somma: -2 1 110
-3 1 101
---------5 11 011
ignoro doppio riporto
(nota:1=0001, compl.a 1 di - (5=0101, -5=1010+1
1 e' 1110,
=1011=risultato sopra)
poi +1 ottengo 1111)
163
codifiche di -2, -6, -7, -13 con una rappresentazione di 5 bit
4) esercizio: calcolare le codifiche dei numeri:
-2, -7, -9, -13
in complemento a due,
con rappresentazione di 5 bit
(1 bit segno, 4 bit dato)
164
codifiche di -2, -6, -7, -13 con una rappresentazione di 5 bit
3) esercizio: calcolare le codifiche dei numeri:
-2, -7, -9, -13
in complemento a due,
con rappresentazione di 5 bit (1 bit segno, 4 bit dato)
codice di +2 = 0 0010
codice di -2 = 1 1101 + 1 = 1 1110
codice di +7 = 0 0111,
codice di -7 = 1 1000 + 1 = 1 1001
codice di +9 = 0 1001,
codice di -9 da 1 0110 + 1 = 1 0111,
codice di +13 = 0 1101,
codice di -13 = 1 0010 + 1 = 1 0011,
165
FINE CODIFICHE NUMERI NEGATIVI
FINE CODIFICHE NUMERI NEGATIVI
166
floating point = “ float, real, …(*) ”
numeri in virgola mobile -
numeri molto ...
numeri molto ...
grandi
piccoli
----------------------------------------------------------------------------------------------------------------------------
(*) corrisponde ad un tipo standard di molti linguaggi di
programmazione
167
codifica in virgola mobile
RAPPRESENTAZIONE DI NUMERI MOLTO
PICCOLI E MOLTO GRANDI --IN VIRGOLA MOBILE (FLOATING POINT)
Possiamo scrivere un dato con parte intera e fratta in molti
modi diversi:
3,14159265
=
=
=
=
=
=
0,314159265 * 101
3,14159265 * 100
314159265
* 10-8
0,0000314159265 * 105
( 314159265, -8 )
ecc
0,314159265 * E+1
<<==
0,314159265 E+1 = forma normalizzata in virgola mobile
168
codifica in virgola mobile
169
0,314159265 E+1 = forma normalizzata in virgola mobile
le varie parti sono codificate separatamente :
(qui 10 = la base dell'esponente, e' implicita)
segno/cifre
/segno esponente/cifre espon.
+ ,314159265
+
1
in binario:
+ ,01010000011...
+
1
ovvero
+ ,10100000110
+
0
(ricorda: 0,001 * 22 = 0,01 * 21 = 0,1 * 20
= 1 * 2 (-1) = 10 * 2 (-2) = ...
0,314E+1-> 314 = cifre = mantissa
E+1 = esponente = caratteristica
codifica in virgola mobile
170
+ 0 , 3141592 E + 01
= forma normalizzata in virgola mobile
Sono in ogni caso presenti :
il segno del dato
+
le cifre del dato (mantissa) = 3141592 = precisione del dato,
(nota: la posizione della virgola decimale
e' a sinistra della prima cifra non nulla del dato)
il segno dell'esponente +
le cifre dell'esponente (caratteristica) = 01 =
ordine di grandezza del dato.
precisione nella codifica in virgola mobile
171
+ 0 , 3141592 E + 01
la virgola (decimale o binaria) si assume generalmente a
sinistra della prima cifra del dato.
[ricorda: scrittura italiana: 0,314E+1 (“virgola mobile”)
-- scrittura anglosassone: 0.314E+1 (“ floating point ”)
Il numero delle cifre del dato (mantissa) determina la
precisione della rappresentazione;
definizione:
precisione
di una codifica
in virgola mobile
=
il numero x piu'
piccolo tale che
1.0 + x <> 1.0
codifica in virgola mobile
precisione
di una codifica
in virgola mobile
=
172
il numero x piu'
piccolo tale che
1.0 + x <> 1.0
ad es. nel caso sopra, assumiamo la codifica con 7 cifre,
allora la precisione e’ data da
+0,000 000 1 E+01 = 1,0E-7
se provo a sommare
1.0 = 1,0E+00 = 0,1 E +01
e
+0,000 000 1 E+01 = 1,0E-7
cosa si ottiene?
codifica in virgola mobile
173
codifica a 7 cifre, la precisione e’ +0,000 000 1 E+01 = 1,0E-7
provo a sommare 1.0 = 1,0E+00 =
e
+0,000 000 1 E+01 =
0,1 E +01
1,0E-7
per sommare, devo avere esponenti uguali, uso il piu'grande:
0,100 00
+0,000 00
-------0,100 00
00 E+01
01 E+01
------01 E+01
risultato diverso da 1,0E+00,
quindi vale appunto che 1.0 + x <> 1.0
ma vediamo con un x piu' piccolo, dove 1.0+x = 1.0 ...
codifica in virgola mobile
1+x = 1 se x e' piu' piccolo della precisione1 e' codificato con:
0,100 00 00
un x < 1.0E-7, ad es. 4.0E-8:
4,000 00 00
174
E+01
E-08
per sommare, devo avere esponenti uguali, uso il piu'grande:
0,100 00
+0,000 00
-------0,100 00
00 E+01
004 E+01
------004 E+01
risultato con otto cifre per il dato - ma il formato e' fisso:
il risultato deve avere 7 cifre!
quindi l'ultima cifra viene troncata (arrotondata) e si ottiene:
0,100 00 00 E+01
e quindi ottengo il risultato uguale al primo addendo !!
codifica in virgola mobile
175
In virgola mobile posso rappresentare numeri molto piccoli
o molto grandi utilizzando lo stesso numero di cifre
(qui sotto 6 cifre - quattro per il dato, 2 per esponente )
in un formato fisso:
27,53
-> 0,2753 E+02
0,000 000 000 07986 -> 0,7986 E-10 piccolo
12340000 0000 0000 -> 0,1234 E+16 grande
codifico ora i numeri con un ipotetico formato in virgola
mobile a 6 cifre decimali, (come sopra 4 per il dato, 2 per l'
esponente); i tre dati di sopra codificati si rappresentano :
| + | + | 02 | 2753 | primo dato 27,53
| + | - | 10 | 7986 | 2.o dato 0,7986 E-10
| + | + | 16 | 1234 | 3.o dato 0,1234E+16
limiti codifica in virgola mobile
27,53
0,2753 E+02
0,000 000 000 07986 0,7986 E-10
12340000 0000 0000
0,1234 E+16
4 cifre per il dato,2 cifre per l'esponente
| + | + | 02 | 2753 | primo dato 27,53
| + | - | 10 | 7986 | 2.o dato 0,7986E-10
| + | + | 16 | 1234 | 3.o dato 0,1234E+16
il numero piu' grande rappresentabile con tale formato:
| + | + | 99 | 9999 | = 0,9999 * 10^99
il numero piu' piccolo rappresentabile con tale formato,
con 4 cifre, normalizzato (prima cifra a sin. e' non zero):
| + | - | 99 | 1000 | = 0,1000 * 10^(-99)
il piu' piccolo con 1 cifra sola (non normalizzato) :
| + | - | 99 | 0001 | = 0,0001 * 10^(-99)
= 0,1 * 10^(-102)
176
codifica in virgola mobile
177
nota - la rappresentazione di un numero in floating point
definisce come si codifica (si scrive) la parte
delle cifre (mantissa)
e la parte che da'
l'ordine di grandezza (esponente, caratteristica)
123,456 si scrivera': 0,123456 E+3
(convenzione: la prima cifra dopo la virgola decimale e' non
nulla, la parte intera e' nulla; usata negli es.seguenti)
oppure (convenzione standard corrente, piu' usata)
1,23456 E+3
la virgola sta dopo la prima cifra non nulla
(che in binario e' sempre 1)
codifica in virgola mobile - codifica e limiti
seguono esempi in binario su un ipotetico formato a 8 bit:
S
segno dato
Z
segno espon
EE
espon
DDDD
dato
1) Per rappresentare il dato 5,0 avremo in binario :
5 = 101,0 * 2^0 (ora normalizzo ) = 0,1010 * 2 ^ 3 =>
0
0
11
1010
S
Z
EE
DDDD
quindi
00111010 e’ la codifica di
0,101 * 2 ^ 3
2) per rappresentare il dato 0,75 avremo in binario:
0,75 = 0,5 + 0,25 = 1/2+1/4 = 0,11 con esponente 0,
quindi
0
0
00
1100
quindi 00001100 rappresenta 0,11 * 2 ^ 0
178
codifica in virgola mobile es 0,125
179
contin. virgola mobile con codifica a 8 bit
SZEEDDDD (S segno dato, Z segno esponente,
EE esponente, DDDD cifre dato)
3) dato 0,125 = 1/8 = 0,001 = 0,001*2^0 =
{ S=0, Z=0, EE=00, DDD=001 } poi normalizzo,
cioe’ virgola binaria a sinistra della 1.a cifra del dato:
= 0,1*2^(-2)(*) codifico l'esponente negativo ad es.in
compl. a uno, quindi (z=meno,EE=2) -2 diventa: -2= 111010 =101, infine il tutto 0,1000*2^(-2) diventa:
0,125 = S E EE DDDD= 0 1 01 1000= 01011000
_____________
(*) nota: di seguito uso a^b oppure ab per indicare a alla b
codifica in virgola mobile es con soli 8 bit ...
cont. codifica in virgola mobile con 8 bit
S segno, Z segno espon,EE espon., DDDD dato
abbiamo visto che 0011 1010 rappresenta 5,0
e che 0,125=1/8=0,0012 si scrive 01011000,
vediamo i numeri piu’piccolo e piu’grande:
il piu'grande
0011 1111 = 0,1111*23 = 8 (circa)
il piu'piccolo
0100 0001 = 0,0001*2-3 = 1,0*2-7 = 1/128
180
codifica in virgola mobile es con soli 8 bit ...
i dati con segno meno sono rappresentati
complementando tutto, quindi ad es. gli stessi di prima:
+5,0
-5,0
= 0011 1010,
= 1100 0101
0,75
-0,75
= 0000 1100,
= 1111 0011
0,125 = 0101 1000,
-0,125 = 1010 0111
181
codifica in virgola mobile: precisione/estensione
182
date n cifre [es. 10 cifre decimali] per rappresentare un dato
in virgola mobile dobbiamo decidere il formato cioe’
dividere le cifre disponibili per le codifiche dei vari pezzi ...
il formato determina l'insieme dei numeri rappresentabili:
* sia per l' estensione dell'intervallo
(ordine di grandezza, num. piu' piccolo/ num. piu' grande)
* sia per la precisione (cifre significative)
nota:
se uso piu' cifre per l'esponente
-> posso rappresentare numeri piu' grandi / piccoli,
-> ma - diminuisce la precisione
(restano meno cifre per il dato)
e viceversa: uso piu’ cifre per dato -> meno cifre per esp.
codifica in virgola mobile: base 1000
183
Possiamo aumentare i limiti di grandezza dei numeri
rappresentabili a pari numero cifre della codifica
cioe' senza aumentare il num.di cifre del codice ... es:
codice con 6 cifre decimali, 2 espon, 4 dato, tutto in base 10
0,50 = 0,50*10^00
=> + +00 5000
3,14 = 3,14*10^00=0,314*10^1 => + +01 3141
0,00123=,123*10^-2
=> + -02 1230
il numero piu' piccolo
+ -99 1000 => 0,1000E-99
il numero piu' grande
+ +99 9999 => 0,9999E+99
NOTA:
qui l' esponente e' con base 10 - se cambio base?
codifica in virgola mobile: base 1000
184
codice con 6 cifre decimali, 2 espon, 4 dato, tutto in base 10
cambio base dell’esponente: invece di 10 e’ 1000 allora:
0,50=0,50 *1000^0
=> + +00 5000
il numero piu' piccolo
+ -99 1000 = 0,1000*(1000^(-99)) =
= 0,1000*((10^3)^(-99)) =0,1000*10^297
= 0,1000 E -297
il numero piu' grande
+ +99 9999 = 0,9999*(1000^(-99)) =
= 0,9999*((10^3)^(99)) => 0,9999 E+297
aumentano i limiti di ordine di grandezza MA ->perdo cifre (precisione):
3,14 = 3,14 *1000^0 = se cambia espon.di uno la virgola si
sposta di TRE posizioni (base esponente e' 1000) !!
= 0,00314*1000^1
0,00123 = ,00123*1000^0
=> + +01 0031
=> + +00 0012
floating point: base dell'esponente
in alcuni modelli di calcolatori sono state usate basi diverse
dalla base due: ad esempio con base 16, e quindi l'intervallo
di numeri rappresentabili era maggiore
dal 1985 si usa lo standard IEEE 754
(che vedremo tra poco)
che usa come base per l'esponente il valore 2
185
codifica in virgola mobile: base 10 vs. base 1000
186
codifica con 6 cifre decimali, 2 espon, 4 dato, tutto in base 10,
base dell’esponente 10:
3,14 = 3,14*10^00=0,314*10^1=> + +01 3141
se la base dell’esponente invece di 10 e’ 1000 allora abbiamo:
3,14=3,14*1000^0=,00314*1000^1=>+ +01 0031
quindi:
se aumento o diminuisco di 1 l’ esponente con base 1000
devo spostare le cifre del dato di 3 posizioni:
avro’ spesso zeri dopo la virgola decimale normalizzata ->
meno cifre utilizzate -> perdo in precisione
in media perdo 1,5 cifre
codifica in virgola mobile
ancora:
93,93
= 0,9393 *10^2 => + +02 939
45678
= 0,45678*10^+5 => + +05 457
0,00712 = 0,712 *10^-2 => + -02 712
0,5555 = 0,5555 *10^-0 => + +00 555
se la base dell’esponente invece di 10 e’ 1000 allora abbiamo:
93,93
= 0,09393 *1000^1 => + +01 093 <<==
45678,0 = 0,045678*1000^2 => + +02 045 <<==
0,00712 = 0,00712 *1000^0 => + +00 007 <<==
0,5555 = 0,5555 *1000^0 => + +00 555 <<==
perdo cifre significative, qui in media perdo 1,5 cifre (meta’
cifre della base) guadagno in limiti di grandezza:
ho 1000^(-99)-- 1000^99 invece di 10^(-99) -- 10^99.
187
esercizio floating point: 7,7E0 in binario ?
188
esercizio floating point:
dato il formato:
12 bit divisi come segue:
1 bit segno del dato
1 bit segno dell'esponente (codifica con eccesso di 2^3)
3 bit valore esponente
(e in complemento a uno)
7 bit valore del dato - ma attenz.: vedi nota qui sotto
dove il 1.o bit del dato e' sempre uno, e non e' memorizzato
(ovvero se il dato - parte mantissa - vale 1011 1111, virgola
binaria posta davanti la prima cifra, il dato e' memorizzato
nella parte cifre come 011 1111 (1.o bit 1 implicito)
trovare la rappresentazione di 7,7 E0
esercizio floating point continua
189
esercizio: convertire 7,7E0 in binario, in formato da 12 bit:
1 bit segno dato;
cifre del dato: 7 bit
esponente: 1 bit segno, 3 bit valore (eccesso 2^3, compl. a 1);
devo convertire le cifre del dato e l'esponente;
qui l'esponente e' zero, quindi devo convertire solo le cifre:
convertire 7,7 da base 10 a base 2:
devo convertire separatamente la parte intera,
semplice: 7-> 111, (sono i tre bit iniziali delle cifre del dato)
e separatamente la parte fratta: solo per quattro bit, perche'
con mantissa a 7 bit, 3 bit gia'dati, devo trovare ancora 4 bit
0,7 = 0,abcd (binario) - moltiplicando per due ripetutamente:
1) 0,7*2->1,4; 2)0,4*2->0,8; 3)0,8*2->1,6; 4) 0,6*2->1,2; 5) 0,2*2->0,4;
quindi per la parte fratta le cifre binarie sono 0,10110
(e' un 0,7 approssimato con 5 bit, 0,5+0,125+0,0625=0, 6875)
il dato in binario e' 111,10110 normalizzo: 1,1110110 * 2^2
esercizio floating point: 7,7E0 in binario, continua
1) convertire 7,7E+0 da base 10 a base 2:
(1 bit segno dato; 7 bit cifre del dato;
esponente: 1 bit segno, 3 bit valore (eccesso di 2^3, compl.a 1);
parte intera 7-> 111, poi la parte fratta con mantissa a 7 bit, devo trovare ancora 4 bit:
1) 0,7*2->1,4; 2)0,4*2->0,8; 3)0,8*2->1,6; 4) 0,6*2->1,2; 5) 0,2*2->0,4;
quindi per la parte fratta le cifre binarie sono 0,10110
(e' un 0,7 approssimato con 5 bit, 0,5+0,125+0,0625=0, 6875)
ora il dato in binario e' 111,10110; normalizzo: 1,1110110 * 2^2
quindi: parte cifre 1,1110110, -> sono 8 bit ?! ... MA:
il primo bit poi sara' implicito, quindi restano 7 bit da memorizzare
la parte esponente 2 cioe' 010, con eccesso di 1000: 1000+010=1010
metto insieme e ho:
0 1 010 1110110
= 6,875 E+0
la precisione e' veramente scarsa... visto le poche cifre per il dato ;-)
190
somma in virgola mobile
somma con numeri in virgola mobile:
0,xxx*10^E1 + 0,yyy*10^E2 =
1) se E1 = E2 allora le due mantisse si possono sommare:
(0,xxx + 0,yyy) *10^E1
es.:
0,314 E + 1 + 0,250E + 1 =
( 0,314 + 0,250 ) * 10 ^ 1 =
= 0,564 * 10^1 =
= 0,564 E + 1
191
somma in virgola mobile
192
Per sommare due numeri in virgola mobile,
se E1 <> E2 allora
devo rendere i due esponenti uguali:
porto l'esponente piu' piccolo al valore del piu' grande,
es: formato con 3 cifre per dato, 1 per esponente:
0,222E+1 + 0,333E-1 -> e1<>e2 per cui non posso
sommare direttamente ->
devo aggiustare uno dei due esponenti, cambio l'esponente
piu' piccolo e lo metto al valore del piu' grande, scalando
di uguale misura la mantissa:
0,222E+1 + 0,00333E+1 = 0,222 * 10 + 0,00333 * 10
= (0,222 + 0,00333) * 10 = 0,22533 E+1 <<== RIS.
siccome ho solo 3 cifre disponibili -> si troncano le cifre
= 0,225 E +1
<== inevitabile errore di troncamento !!!
somma in virgola mobile - normalizzare risultato
193
attenz: se la somma delle mantisse fornisce un numero
maggiore di uno allora si deve normalizzare il risultato:
0,966 E+1 + 0,555 E+0 =
0,966 E+1 + 0,0555E+1 = 0,966 * 10 + 0,0555 * 10 =
= ( 0,966 + 0,0555 )* 10 = (1, 0215) * 10
= 1,0215 E+1 = 0,10215 E+2 [esponente normalizzato]
= 0,102E+2
forma normalizzata solo 3 cifre ->
abbiamo di nuovo un errore troncamento !
ancora un es.:
0,997E+1 + 0,00423E+1 = 0,997 * 10 + 0,00423 * 10
= (0,997 + 0,00423) * 10 = 1,00123E+1 = 0,100123E+2
= 0,100E+2
somma in virgola mobile
194
Per sommare due numeri in virgola mobile:
se e1 <> e2 allora devo rendere i due esponenti uguali:
abbiamo visto la somma fatta portando
l'esponente piu' piccolo al valore del piu' grande ...
e se invece porto l’ esponente piu’ grande
al valore del piu’ piccolo?
->
0,997E+1 + 0,423E-1 = 99,7E-1 + 0,423E-1
non cambia molto ... ma ottengo un numero in forma non
normalizzata, devo in ogni caso normalizzare => alla fine
ho lo stesso risultato ...
... non si usa
codifica in virgola mobile : overflow
195
puo’ succedere che
il risultato della somma non sia rappresentabile:
dati: 0,9983E+99 e 0,7044E+98, rappresentati ad
es. formato decimale , 2 cifre per esponente, 4 per dato:
+99
,9983 =
+98
,7044 =
----------------------
99
,9983
99
,07044
----------------sommiamo:
99 1,06874 -> normalizzo 100 ,106874 -> l’esponente e’ > 99
non posso rappresentare l'esponente 100 ->
il risultato esce dai limiti della codifica !
==> errore di traboccamento ==> overflow
codifica in virgola mobile: overflow
196
se l'esponente del risultato di un’operazione aritmetica
non e' rappresentabile allora c’e’ un errore di “overflow”:
// caso di formato decimale, con 2 cifre per esponente e 4 per dato:
+99 9983 =
99
,9983
+98 7044 =
99
,07044
------------ ---------99 1,06874 -> normalizzo 100 ,106874 -> esponente e’ >99
non posso rappresentare l'esponente 100 ! //
nei calcolatori c'e' spesso un meccanismo di controllo
automatico su questo errore:
se c’e’un "floating point overflow" allora il calcolatore
interrompe (HW!) l' esecuzione del programma e segnala
questo fatto in qualche modo.
standard IEEE
197
FORMATI STANDARD IN VIRGOLA MOBILE
(IEEE standard 754 Binary Floating Point Arith del 1985)
s
1,ddd...ddd
E
z ee..ee
=
(segno dato s) * [mantissa 1,dddddd] * parte Esponente
[= segno z esponente * caratteristica = cifre esponente eeee ]
formato a 32 bit,
mantissa dd...dd a 23 bit, esp. zee...ee a 8 bit
formato a 64 bit,
formato a 80 bit,
standard IEEE 754 del 1985
198
formato a 32 bit (single precision)
max 3.4 E+38
min 1.5 E-45 non normalizzato positivo
min 1.2 E-38 normalizzato positivo
mantissa: 23 bit con sottinteso l'uno davanti alla virgola
binaria, quindi sono 24 bit, precisione di 7,4 cifre decimali
il dato e' sempre espresso in modo che la mantissa e' compresa
tra 1.000..00 e 1.111..11 (dato normalizzato)
esponente binario codice a 8 bit da -126 a +127, con base 2 e
rappresentazione in eccesso di 127;
(codici 00..0 e 11..1 usati per valori speciali)
formato bit (virgola a dest.della 1.a cifra D)
S
ZEEEEEEE
D,DDD DDDD DDDD DDDD DDDD DDDD
D non e' memorizzato, e' implicito
es.
il dato 42.6875 si codifica come segue:
199
42.6875 = 101010.1011 = 1.010101011 x 2 5
che per l'esponente da':
127+5 = 132 = 10000100 (8 bit)
e per la mantissa
1,01010101100000000000000 (23 bit)
e per il segno
0 (1 bit)
totale: 0 10000100 01010101100000000000000
200
Nota:
il numero piu' grande per un numero in virgola mobile
a 32 bit in formato standard e'
esponente (8 bit, base 2): 127 = 01111111
mantissa:(2-2^(-23))=1.1111111111111111111111
quindi il valore (massimo) rappresentato e':
max = (2-2^(-23))*2^(127) = 3.403*10^38
ed il valore minimo (piu' piccolo) ?
dato normalizzato, la mantissa piu' piccola e' 1.0
esponente piu' piccolo (base 2) e' -127
standard IEEE
formato a 64 bit (double precision)
circa 15 cifre decimali e intervallo da 10^-300 a 10^300,
max 1.7 E+308
min 5.0 E-324 non normalizzato posit.
min 2.3 E-308 normalizzato posit.
esponente binario 11 bit da -1022 a +1023,
mantissa: 52+1 (bit implicito) bit
cioe' la precisione e' di 15,5 cifre decimali
formato bit:
S EEE EEE EEE EE DDDDD DDDDD DDDDD DDDDD
DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DD
201
standard IEEE
formato a 80 bit (extended)
max 1.1 E+4932
min 1.9 E-4951 non normalizzato posit.
min 1.7 E-4932 normalizzato posit.
precisione: 19,5 cifre
esponente binario 15 bit da -16382 a 16383,
mantissa: 63+1 bit (19,5 cifre decimali)
formato in binario:
S EEEEE EEEEE EEEEE
DDD DD DDD DD
DDD DD DDD DD
DDD DD DDD DD
DDD DD DDD DD
DDD DD DDD DD
DDD DD DDD DD
DDD
202
standard IEEE
quadrupla precisione a 128 bit:
15 bit per l'esponente
111 bit per la mantissa
(normalizzata con 1 davanti la virgola binaria)
massimo esponente 32767 (con base binaria)
203
altre rappresentazioni (non piu'usate)
204
osservazione: gli stessi bit possono essere divisi in molti
modi, e prima dello standard IEEE 754 erano in uso ad es.
l' IBM 370 usava la codifica:
esponente 7 bit, base 16;
mantissa 24 bit (7,5 cifre circa)
quindi il massimo rappresentabile
max = 16^63 * 0,FFFFFF = 0,9999 * E+75
min = 16^(-64) * 0,000001 = 0,1 * E-79
fino agli anni 80 erano in uso molte codifiche diverse, ogni
casa costruttrice usava una sua codifica
(la Digital usava una sua (su VAX),
la Control Data usava una ancora diversa a 60 bit, ecc)
codici per infinito / non definito
205
Nota 2) :
lo standrad prevede dei codici particolari per indicare
numeri "molto grandi" o "praticamente infiniti", usati per i
risultati di operazioni del tipo:
7,5 / 0.0
e altri codici per indicare numeri "non definiti" usati per il
risultato di un'espress. aritm. del tipo:
infinito * zero
zero / zero
viene poi definita un' aritmetica per questi codici, del tipo:
infinito * x = infinito,
non_definito + x = non_definito
...
unita' aritmetica per interi / per virgola mobile
206
Nota 3): Le operazioni aritmetiche in virgola mobile sono
piu' complesse delle operazioni analoghe su interi, e la
realizzazione hw e' piu' complessa.
Le istruzioni aritm. in virgola mobile sono realizzate (su
calcolatori piccoli) con sequenze di istruzioni apposite
(sottoprogrammi);
L' aritmetica in virgola mobile e' realizzata circuitalmente in
un'unita' di calcolo "floating-point unit", che puo'essere
separata dall'unita' centrale, cosi’ erano ad es. INTEL 80286
+ f.p.u. 80287 o MOTOROLA 68020 + f.p.u. 68882)
oppure fa parte dell'unita' centrale, che diventa un po' piu'
grande; cosi' era per i calcolatori "grandi" (mainframe, es
VAX9000, IBM 370-XA - ma anche nei micro processori
successivi al 1995 per personal, tipo Intel Pentium o Power
PC o ALFA)
Esercizi: 1)
207
*) e’ dato un formato di numero in virgola mobile (binario)
con 16 bit di cui 10 per le cifre (mantissa) e 5 per l'esponente
(compreso il segno dell'esp. “z”):
S Z E E E E D D D D D D D D D D <= binario
a) trovare la precisione in decimale
(quante cifre decimali, ovvero il numero
x piu' piccolo tale che 1+x <> x)
b) trovare la codifica binaria in tale formato di:
13.5 (in base 8) = 11.625 (in base 10), poi di
6.5 (in base 10), e 5.55 (in base 10) -> per questo valore
trovare poi (dal codice binario in virgola mobile) il valore
corrispondente in decimale: quante cifre sono state perse?
esercizi 2)
208
*) dato il formato di numero in virgola mobile [formato di
codifica gia' visto] con 16 bit, di cui 10 per le cifre (mantissa)
e 5 per l'esponente (compreso segno dell' espon. “z”):
S ZEEEE DDD DDD DDD D
c) sono rappresentabili esattamente i dati:
3.5, 23.0, 555.0, 5252.0, 78951.0 ?
esercizi 3)
*) trovare le regole per
a) la moltiplicazione e
b) la divisione in virgola mobile
(si usi un formato decimale a 6 cifre, di cui 2 per
l' esponente e 4 per la mantissa)
209
indice sistemi posizionali
2 rappresentazione di numeri
15 conversione analogico - digitale
16 immagini digitali: pixel, colori
28 sistema unario
33 il sistema latino
35 codici posizionali in varie basi
60 un quiz
63 somme numeri in base 2, 3, ..
67 prodotto in binario
72 base sedici (esadecimale)
73 cambio base
82 esercizi
93 frazioni
104 0,1 da base 10 a base due
115 limiti e overflow
210
indice capitolo numeri con segno:
NUMERI CON SEGNO
120
126
132
140
149
155
numeri con segno
numeri in complemento a uno
somme con segno
complemento a due
rappresentazione in eccesso di k
esercizi sui numeri con segno
211
indice capitolo numeri in virgola mobile :
NUMERI IN VIRGOLA MOBILE
167
171
176
188
191
195
197
207
210
213
rappresentazione di n.i grandi/piccoli
precisione
limiti
esercizio
somma in floating point
overflow
standard IEEE 754 floating point
esercizi
indice
fine parte numeri
212
fine parte numeri
213
FINE
PARTE
NUMERI
Scarica

Bnumeri3 - UniNa STiDuE