Aritmetica dei Calcolatori
Luca Abeni e Luigi Palopoli
February 25, 2015
Informazione nei Computer
• Un computer è un insieme di circuiti elettronici...
• ...In ogni circuito, la corrente può passare o non passare
• Passa corrente: 1
• Non passa corrente: 0
• ⇒ un computer memorizza (e manipola) solo sequenze di 0 e 1
• Sequenze di 0 e 1 devono poter rappresentare tutti i tipi di
informazione che un computer gestisce: valori numerici,
caratteri o simboli, immagini, suoni, programmi, ...
• Una singola cifra (0 o 1) è detta bit; sequenze di 8 bit sono chiamate
byte
Calcolatori
Luca Abeni – 2 / 41
Codifica delle Informazioni - 1
• Per fare si che una sequenza di bit (cifre 0 o 1) possa essere
interpretata come informazione utile, deve essere stabilita una
codifica (rappresentazione digitale)
• Tutto deve essere codificato opportunamente per rappresentarlo in
questo modo
• Numeri (interi con e senza segno, razionali, reali, ...)
• Caratteri / testo
• Programmi (sequenze di istruzioni macchina)
• Immagini e Suoni
• Si, ma come codifichiamo tutta questa roba???
Calcolatori
Luca Abeni – 3 / 41
Codifica delle Informazioni - 2
• Codifica: funzione che associa ad un oggetto / simbolo una
sequenza di bit
• Codifica su n bit: associa una sequenza di n bit ad ogni entità da
codificare
• Permette di codificare 2n entità / simboli distinti
• Esempio: per codificare i semi delle carte bastano 2 bit
• Picche → 00
• Quadri → 01
• Fiori → 10
• Cuori → 11
Calcolatori
Luca Abeni – 4 / 41
Codifica dei Numeri
• Rappresentiamo un numero come sequenza di 0 e 1...
• ...Cominciamo con cose semplice: numeri naturali (interi positivi)
n∈N
• Per capire come fare, consideriamo i numeri “che conosciamo”
(base 10)
• Se scrivo 501, intendo 5 ∗ 100 + 0 ∗ 10 + 1(∗100 )
• Sistema posizionale: il valore di ogni cifra dipende dalla sua
posizione
• Sistema decimale (base 10): ho 10 cifre (0 . . . 9)
Calcolatori
Luca Abeni – 5 / 41
Basi di Numerazione
• In generale, un numero naturale è una sequenza di cifre
• B possibili cifre (da 0 a B − 1)
• B è detto base di numerazione
• Siamo abituati a 10 cifre (sistema decimale, o in base 10), ma
nulla vieta di usarne di più o di meno...
• Il valore di una sequenza di cifre ci ci−1 ci−2 . . . c0 si calcola
moltiplicando ogni cifra per una potenza della base B, che dipende
dalla posizione della cifra
ci ci−1 ci−2 . . . c0 = ci ∗ B i + ci−1 ∗ B i−1 + . . . + c0 ∗ B 0
• Una sequenza di cifre da interpretarsi come numero in base B è
spesso indicata con pedice B (50110 , 7538 , 1101102 , 1AF16 ...)
Calcolatori
Luca Abeni – 6 / 41
Esempi con Basi di Numerazione Diverse da 10
• Base 2 (cifre: 0 e 1): sistema binario
• Esempio: 11012 = 1 ∗ 23 + 1 ∗ 22 + 0 ∗ 21 + 1 ∗ 20 = 1310
• Base 8: sistema ottale
• Esempio: 1708 = 1 ∗ 82 + 7 ∗ 81 + 0 ∗ 80 = 12010
• Base 16: sistema esadecimale
• Esempio: 1AF16 = 1 ∗ 162 + 10 ∗ 161 + 15 ∗ 160 = 43110
• Le cifre da 10 a 16 sono rappresentate dalle lettere da A ad F
(A16 = 1010 , B16 = 1110 , ... F16 = 1510 )
Calcolatori
Luca Abeni – 7 / 41
Hai Detto... Binario?
• Sistema binario: 2 sole cifre (0 e 1)
• Sembra fatto apposta per i computer!
• Un numero naturale è rappresentato in binario su k cifre
• Cifra binaria: binary digit — bit
• Numero binario su k cifre: valori fra 0 e 2k − 1
• Valori comuni per k: 8, 16, 32, 64
• Le potenze di 2 rivestono un ruolo molto importante!
• Ricordi? Bit raggruppati in sequenze di 8, dette byte
• Ogni byte può assumere 28 valori, da 0 (= 000000002 ) a 255
(= 111111112 )
Calcolatori
Luca Abeni – 8 / 41
Altre Basi di Numerazioni Utili
• La base 2 è la base “nativa” dei computer...
• ...Ma i numeri in base 2 possono richiedere un gran numero di cifre!
• Esempio: 100010 = 11111010002
• Spesso si usa la base 16 (numerazione esadecimale) per ridurre il
numero di cifre
• Ogni cifra esadecimale corrisponde a 4 cifre binarie
• La conversione fra binario ed esadecimale (e viceversa) è molto
semplice
• Esempio: (0011 1110 1000)2 = 3E816
Calcolatori
Luca Abeni – 9 / 41
Conversioni fra Basi
• Base 2 ↔ 16: come visto (si convertono 4 bit in una cifra
esadecimale e viceversa)
• Base B → 10: già visto anche questo (si moltiplica ogni cifra ci per
B i , dipendentemente dalla sua posizione)
• Base 10 → B: si divide iterativamente il numero per B
1. Per convertire x10 in base B:
2. Divisione intera fra x e B
3. Il resto e’ la cifra da inserire a sinistra nel numero convertito
4. Il quoziente viene assegnato ad x
5. Ritorna al punto 2
Calcolatori
Luca Abeni – 10 / 41
Esempio di conversione
100010
X
1000
500
250
125
62
31
15
7
3
1
100010
Calcolatori
=?2
x
X/2 X%2 


500 0


250 0


125 0


62
1


31
0


15
1



7
1


3
1


1
1


0
1
= 11111010002
100010 =?16
X
1000
62
3
X/16
62
3
0
x
X%16 


8

14 (E) 


3
100010 = 3E816
Luca Abeni – 11 / 41
Approssimazioni nella Rappresentazione di Numeri
• Numero in base 2: codifica (rappresentazione) di numero naturale
• Ma i numeri naturali n ∈ N sono infiniti!
• Mentre un computer può utilizzare un numero finito k di bit...
• Come detto, i computer rappresentano un numero su k bit
• Numero finito di cifre (k)
• Ma un numero n ∈ N può avere infinite cifre...
• Solo un sottoinsieme dei numeri naturali è rappresentabile!
Calcolatori
Luca Abeni – 12 / 41
Overflow
• Supponiamo di rappresentare i numeri su k bit...
• ... e di sommare due numeri a e b entrambi rappresentabili
• a ∈ N,b ∈ N
• a ≤ 2k − 1, b ≤ 2k − 1
• È però possibile che a + b > 2k − 1
• Qual’è il risultato della somma? Come si rappresenta?
• a + b non codificabile su k bit
• Il computer può solo segnalare un errore → Overflow!
• Deve esistere un modo per capire se un’operazione è risultata in un
overflow
• SO o applicazioni hanno il compito di gestire queste situazioni
Calcolatori
Luca Abeni – 13 / 41
Somme e Sottrazioni in Base 2
• Un’introduzione, prima
A
0
1
0
1
0
1
0
1
B
0
0
1
1
0
0
1
1
Carry
0
0
0
0
1
1
1
1
C
0
1
1
0
1
0
0
1
Carry
0
0
0
1
0
1
1
1
A + B + Carry = C + Carry
Calcolatori
Luca Abeni – 14 / 41
Somma di naturali
• Esempio
11710 + 9710 = 11101012 + 11000012 = ?
1
1
1
1
1
1
0
1
0
1
0
0
0
1
0
1
0
0
1
1
1
0
+
=
110101102 = 21410
Calcolatori
Luca Abeni – 15 / 41
Sottrazione di Naturali
• Sottrazione di naturali: Operazione di base e “Il prestito”.
Come nella somma si va da destra a sinistra seguendo delle regole
banali:
A
B
A-B
0
0
0
1
0
1
1
1
0
0
1
1
Nell’ultimo caso bisogna scorrere a sinistra finchè non si trova un 1,
invertendo il valore di tutte le cifre incontrate, 1 compreso.
10..0 → 01..1
Calcolatori
Luca Abeni – 16 / 41
Sottrazione di naturali
• Esempio
21410 − 11710 = 110101102 − 11101012 = ?
1
Calcolatori
1
1
1
0
1
1
1
1
0
0
0
0
1
1
0
1
0
0
0
1
1
=
Luca Abeni – 17 / 41
Sottrazione di naturali
• Esempio
21410 − 11710 = 110101102 − 11101012 = ?
1
1
1
1
0
1
1
1
1
0
0
0
0
1
1
0
1
0
0
0
1
1
=
11000012 = 9710
Calcolatori
Luca Abeni – 17 / 41
Moltiplicazione per potenze di due
• Moltiplicazione (e divisione) per potenze di due.
Ok, se dobbiamo moltiplicare un numero base-10 per 10 dobbiamo...
Aggiungere uno 0 a destra.
• Nel caso dei numeri base-2, aggiungere uno 0 a destra significa
moltiplicare il numero per 2, mentre eliminando la prima cifra a desra
significa dividere per 2.
Questa operazione è chiamata shifting, utilizzata spesso dai
compilatori per ottimizzare la moltiplicazione
Calcolatori
Luca Abeni – 18 / 41
Moltiplicazione tra due Naturali
• Moltiplicare due numeri base-2 naturali altro non è che l’applicazione
di shifting multipli e poi della somma sui risultati degli shifting.
Alla fine non é differente dalla moltiplicazione in base-10, solo che è
più semplice perché o bisogna sommare uno dei due moltiplicatori
shiftati o nulla.
• Esempio
1310 × 1710 = 11012 × 100012 = ?
1
1
0
1
1
0
1
0
0
0
-
1
1
1
0
1
Calcolatori
1
1
1
1
0
0
1
1
1
1
x
=
+
+
+
+
Luca Abeni – 19 / 41
Codifica dei Numeri Interi
• k bit → codificano 2k simboli/valori/numeri...
• Si usa la base 2 per codificare i numeri
• Numeri naturali n ∈ N : valori da 0 a 2k − 1
• Come codificare numeri interi z ∈ Z?
• Problema: numeri negativi z < 0 ⇒ z ∈
/N
• Si codificano sempre 2k valori...
• ... Ma quali???
• Varie possibilità: modulo e segno, complemento a 1, complemento a
2, ...
Calcolatori
Luca Abeni – 20 / 41
Codifica con Modulo e Segno
• Idea semplice: si usano k − 1 bit per rappresentare il valore assoluto
(modulo) del numero...
• ...Ed un bit per codificare il segno!
• bit più significativo a 0: numero positivo
• bit più significativo a 1: numero negativo
• Valori codificati: da −2k−1 + 1 a 2k−1 − 1
• 2k − 1 valori???
• Come mai??? Due diverse sequenze di bit per codificare lo 0?
(+0 e −0???)
k−1
k−1
z }| {
z }| {
• 1 000 . . . 0 vs 0 000 . . . 0
Calcolatori
Luca Abeni – 21 / 41
Codifica in Complemento a 1
• Altra idea semplice: i numeri negativi si rappresentano facendo il
complemento ad 1 del valore assoluto
• Numero positivo: rappresento il valore assoluto
• Numero negativo: cambio 0 in 1 e viceversa (complemento a 1
k
z }| {
di x: 1 . . . 1 −x = (2k − 1) − x)
• Numeri positivi: ancora, bit più significativo a 0
k
k
z }| {
z }| {
• Ancora, due rappresentazioni dello 0 (+0 e −0)? 111 . . . 1 vs 000 . . . 0
• Modulo e segno → Non facile da sommare...
• Complemento a 1 → a volte le cose vanno meglio (se il bit più
significativo non da’ riporto, OK)
Calcolatori
Luca Abeni – 22 / 41
Somma di Numeri in Complemento a 1
• Somma di numeri interi codificati in complemento a 1:
1. Sommare le rappresentazioni dei due numeri
2. Riporto sul bit più significativo → sommarlo al risultato
3. Se i riporti delle due cifre più significative della nuova somma
sono uguali, il risultato è attendibile
4. Altrimenti, il risultato non è rappresentabile su k bit
• Esempio: 6 + −3 (codifica su 5 bit)
1
• 6 = 00110; −3 = 00011 = 11100
1
0
1
0
1
0
1
0
1
1
0
1
0
1
0
0
0
• 00010 + 1 = 00011 (= 3)
Calcolatori
Luca Abeni – 23 / 41
Complemento a 2
• Complemento a 2 di un numero binario:
• Scorrere i bit a partire dalla destra
• Fino al primo bit che vale 1 (compreso), invariato
• A partire dal bit successivo, fare il complemento a 1
• Equivalente a fare il complemento a 1 e poi sommare 1
k
z }| {
k
• Complemento in base 2 di x: 2 − x = 1 0 . . . 0 −x
• Esempio: complemento in base 2 di 87 (= 10101112 )
• 1 più a destra invariato, poi inverto : 0101001
• 272 − 10101112 = 100000002 − 10101112 = 101001
• Complemento a 1 +1: 0101000 + 1 = 101001
Calcolatori
Luca Abeni – 24 / 41
Codifica in Complemento a 2
• Numeri positivi: rappresentare il valore assoluto
• Numeri negativi: rappresentati usando il complemento a 2 del valore
assoluto
• Ancora, il bit più significativo indica il segno
• Stavolta, la codifica dello 0 è unica
• Codifica i numeri da −2k−1 a 2k−1 − 1
• E stavolta, la somma è semplice...
• x + (−y) = x + (2k − y) = 2k + x − y...
• ...Su k bit, questo è equivalente a x − y
Calcolatori
Luca Abeni – 25 / 41
Esempi di Codifica
decimale
-4
-3
-2
-1
0
1
2
3
Calcolatori
modulo
e segno
complemento
a1
111
110
101
100 / 000
001
010
011
100
101
110
111 / 000
001
010
011
complemento
a2
100
101
110
111
000
001
010
011
Luca Abeni – 26 / 41
Somme e Sottrazioni in Base 2
• Come normalmente in base 10 (numeri in colonna, riporto, etc...)
• Se si usa complemento a 2, funziona anche con numeri negativi
• Ma occhio agli overflow!!!
• Overflow? Numeri su k bit, ma risultato non rappresentabile su
k bit
• Matematica “dell’orologio”...
• Esempi: k = 6, 5 + 12
0
0
0
1
0
0
1
1
0
1
0
1
1
0
0
0
0
1
0
1
• k = 7, 5 − 8; k = 7, −5 + 8; k = 7, −64 − 8; k = 7, 63 + 1;
Calcolatori
Luca Abeni – 27 / 41
Esempi Senza Overflow
• k = 7, 5 − 8
• 5 = 00001012 ; −8 = 00010002 + 12 = 11101112 + 12 = 11110002
0 0 0 0 1 0 1
1 1 1 1 0 0 0
1 1 1 1 1 0 1
• 11111012 =... −(11111012 + 12 ) = −00000112 = −3
• k = 7, −5 + 8
• −5 = 00001012 + 1 = 11110102 + 12 = 1111011; 8 = 00010002
1 1 1 1 0 0 0 0
1 1 1 1 0 1 1
0 0 0 1 0 0 0
0 0 0 0 0 1 1
• 00000112 = 3
Calcolatori
Luca Abeni – 28 / 41
Esempio di Overflow
• k = 7, −64 − 8
• 64 = 10000002 ;
−64 = 10000002 + 12 = 01111112 + 12 = 10000002
• 8 = 00010002 ; −8 = 00010002 + 12 = 11101112 + 12 = 11110002
1
1 0 0 0 0 0 0
1 1 1 1 0 0 0
0 1 1 1 0 0 0
• 01110002 = 56... WTH??? Sommando 2 numeri negativi si
ottiene un numero positivo???
• −64 − 8 = −72...
• Numeri rappresentabili: −26 = −64 → 26 − 1 = 63...
Calcolatori
Luca Abeni – 29 / 41
Esempio di Overflow
• k = 7, 63 + 1
• 63 = 01111112
• 1 = 000000012
1 1 1
0 1 1
0 0 0
1 0 0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
• 10000002 = −(10000002 + 1) = −(01111112 + 12 ) = −1000000 =
−64... WTH??? Sommando 2 numeri positivi si ottiene un
numero negativo???
• Ancora, il risultato corretto (63 + 1 = 64) non sarebbe
rappresentabile...
Calcolatori
Luca Abeni – 30 / 41
Esempi ed Esercizi
• Numeri su k = 7 bit, codificati in complemento a 2
• Verificare se c’è overflow
• 0110110 + 0000011
• Somma di due numeri positivi: mi aspetto risultato positivo...
• 1001010 + 1111101
• Somma di due numeri negativi: mi aspetto risultato
negativo...
• 1001010 + 1100000
• Somma di due numeri negativi: mi aspetto risultato
negativo...
• 0100000 + 1111010
• 1100000 + 0000110
Calcolatori
Luca Abeni – 31 / 41
Ancora su Overflow
• Abbiamo visto overflow in somme (/ sottrazioni) fra interi
• Se a + b > 2k−1 − 1, overflow!
• Se a + b < −2k−1 , overflow!
• Nota: per definizione, −2k−1 ≤ a ≤ 2k−1 − 1 e −2k−1 ≤ b ≤ 2k−1 − 1
• Overflow solo se a e b hanno lo stesso segno!!!
• Può esserci overflow anche in caso di numeri naturali
• Esempio: k
1 1
1 1
1 1
1 0
= 7, 100 + 100 (100 = 11001002 )
1
0 0 1 0 0
0 0 1 0 0
0 1 0 0 0
• 10010002 = 64 + 8 = 72: 100 + 100 = 72???
Calcolatori
Luca Abeni – 32 / 41
La Matematica dell’Orologio
• Aritmetica modulare: considero solo n numeri interi
• Numeri da 0 a n − 1...
• ...O numeri da −n/2 a n/2 − 1...
• Arrivato al numero più grande, riparto dal più piccolo
• Se i numeri vanno da 0 a n − 1, (n − 1) + 1 = 0 (contando dopo
n − 1 riparto da 0)
• Se i numeri vanno da −n/2 a n/2 − 1, n/2 − 1 + 1 = −n/2
• Numeri sul quadrante di un orologio!
• Definizione più formale: classi di equivalenza modulo n
• Relazione di equivalenza fra due numeri: a ≡ b ⇔ a%n = b%n
Calcolatori
Luca Abeni – 33 / 41
Cosa Succede in Caso di Overflow?
• Operazioni su numeri di k bit → aritmetica modulo 2k
• Calcolando a + b si ottiene in realtà (a + b)%2k ...
• ...Se il risultato della somma è < 2k , allora (a + b)%2k = a + b ←
no overflow!
• Altrimenti, risultato “strano”...
• Usando rappresentazione in complemento a 2 dei numeri interi, il
discorso è analogo:
• Se a + b è compreso fra −2k−1 e 2k−1 − 1, allora no overflow
(risultato corretto)!
• Se a + b < −2k−1 , ottengo a + b + 2k . Positivo!!! Overflow!
• Se a + b > 2k−1 − 1, ottengo a + b − 2k . Negativo!! Overflow!
Calcolatori
Luca Abeni – 34 / 41
Rappresentazione dei Numeri Reali
• Rappresentare esattamente un numero reale x ∈ R non è
possibile...
• Numero reale: numero infinito di cifre decimali non periodiche...
• ...Non rappresentabile con un numero finito di bit!
• Rappresentiamo un’approssimazione di numeri reali!!!
• Alcuni numeri sono rappresentabili correttamente...
• ...Altri no
• Rappresentazione in virgola mobile
• Numero fisso di cifre significative, ma numero variabile di cifre
dopo la virgola
Calcolatori
Luca Abeni – 35 / 41
Virgola Fissa e Mobile
• Numero reale su k cifre: si possono dedicare k − f cifre alla parte
k
z
}|
{
intera e f cifre alla parte frazionaria: ck−1 ck−2 · · · cf . cf −1 · · · c0
{z
} | {z }
|
k−f
• x10 =
Pk
i=0 ci
B i−f
=
Pk
i=0 ci
B i /B f
=
Pk
i=0 ci B
f
i
· B −f
• Convertiamo il numero in base 10 come se non avesse virgola e
poi moltiplichiamo per B −f : Virgola fissa!
• Un grosso vantaggio della virgola fissa è che le operazioni si
fanno in maniera semplice. E’ sufficiente effettuare somme,
sottrazioni, moltiplicazioni come se fossimo tra interi e riscalare
il risultato.
• Questo semplifica i requisiti per realizzare una CPU.
• Inoltre se i risultati sono rappresentabili, le operazioni non
introducono errori di approssimazione.
Calcolatori
• Gli svantaggi emergono quando vogliamo trattare nella stessa
applicazione sia numeri grandi che numeri piccoli (cio
è quando
Luca
Abeni – 36 / 41
Virgola Mobile
• Virgola mobile: f non è fisso...
• x = M · BE
• M : mantissa
• E: esponente
• Numero x è rappresentato in virgola mobile su k bit
• x = M · BE
• m bit per la mantissa M ...
• ...e e = k − m bit per l’esponente E
• L’esponente è quello che fa “muovere la virgola”
• Nei computer, B = 2 (rappresentazione binaria)
• Mantissa ed esponente: positivi o negativi
Calcolatori
• Segno mantissa: segno di x
Luca Abeni – 37 / 41
Numeri Reali in C
• Standard IEEE (IEEE 754)
• Mantissa M : modulo e segno (bit di segno s!)
• Mantissa “normalizzata”: 1.M
• Esponente −2e−1 + 1 < E ≤ 2e−1 − 1 rappresentato come
E ′ = E + 2e−1 − 1. Notare che (E ′ > 0)
• E ′ = 0 ha un significato speciale: E = −(2e−1 − 2) e mantissa 0.M .
Anche E ′ = 2e − 1 ha un significato speciale
(
E ′ −(2e−1 −1)
1.M
·
2
Se s = 0
′
E >0:x=
′ −(2e−1 −1)
E
−1.M · 2
Se s = 1
(
e−1 −2)
−(2
0.M · 2
Se s = 0
E′ = 0 : x =
e−1
−0.M · 2−(2 −2) Se s = 1
Calcolatori
Luca Abeni – 38 / 41
Tipi Floating Point in C
• float: precisione singola
• k = 32
• e = 8, m = 23
• double: precisione doppia
• k = 64
• e = 11, m = 52
• long double: precisione estesa o quadrupla
• k = 80 o k = 128
• e = 15, m = 64 o m = 112
Calcolatori
Luca Abeni – 39 / 41
Esempio: Precisione Singola
• Approssimazioni di numeri reali rappresentate su 32 bit
• Esponente rappresentato su 8 bit
• Se E ′ 6= 0, si sottrae 27 − 1 = 127
• Se E ′ = 0, esponente −27 − 2 = −126
• Mantissa rappresentata su 23 bit
• Bit s di segno
′
s
E ′ −127
E 6= 0 ⇒ x = (−1) · 1.M · 2
E ′ = 0 ⇒ x = (−1)s · 0.M · 2−126
Calcolatori
Luca Abeni – 40 / 41
Precisione Singola - Valori Massimo e Minimo
• Massimo valore rappresentabile:
23
z }| {
• Massima mantissa: M = 1 · · · 1
• Massimo esponente: E = 254 − 127 = 127
23
z }| {
• x = 1. 1 · · · 1 ·2127 = (2 − 2−23 ) · 2127 ≃ 3.4 · 1038
• Minimo valore rappresentabile: ≃ −3.4 · 1038
• Minimo valore positivo rappresentabile:
• Minima mantissa: M = 1
• Esponente: E ′ = 0 ⇒ E = −126
23
z }| {
• x = 0. 0 · · · 1 ·2−126 = 2−23 2−126 ≃ 1.4 · 10−45
Calcolatori
Luca Abeni – 41 / 41