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