Moltiplicazioni e Divisioni G. Michele Pinna (1)
moltiplicazione Abbiamo 3 versioni: Alu a 64 bit, due registri a 64 bit ed uno a 32 Alu a 32 bit, un registro a 64 e due a 32 Alu a 32 bit, un registro a 64 ed uno a 32 Osservazione: ho un solo algoritmo gli altri sono sono basati su osservazioni su come risparmiare spazio Per le moltiplicazioni con il segno algoritmo di Booth (2)
Moltiplicazione (1/3) Il risultato su 2n bit tutti posti a zero 1. controllo la cifra più a destra del moltiplicatore a) se è 0 non fare nulla b) se è 1 allora somma il moltiplicando al risultato 2. scala il moltiplicando di 1 bit a sinistra 3. scala il moltiplicatore di 1 bit a destra 4. quante volte? n (3)
Moltiplicazione (2/3) inizio moltiplicatore0 = 1 1 1 a moltiplicatore0 = 0 2 3 fine si n volte? no (4)
Moltiplicazione (3/3) moltiplicando 64 bit scalamento a sinistra ALU a 64 bit moltiplicatore scalamento a destra 32 bit prodotto scrittura 64 bit controllo (5)
Moltiplicazione rivista (1/3) Il risultato su 2n bit tutti posti a zero 1. controllo la cifra più a destra del moltiplicatore a) se è 0 non fare nulla b) se è 1 allora somma il moltiplicando alla parte sinistra del risultato 2. scala il risultato di 1 bit a destra 3. scala il moltiplicatore di 1 bit a destra 4. quante volte? n (6)
Moltiplicazione rivista (2/3) inizio moltiplicatore0 = 1 1 1 a moltiplicatore0 = 0 2 3 fine si n volte? no (7)
Moltiplicazione rivista (3/3) moltiplicando 32 bit ALU a 32 bit moltiplicatore scalamento a destra 32 bit prodotto scrittura scalamento a destra 64 bit controllo (8)
Moltiplicazione finale (1/3) Il risultato su 2n bit in cui mettiamo il moltiplicatore 1. controllo la cifra più a destra del risultato a) se è 0 non fare nulla b) se è 1 allora somma il moltiplicando alla parte sinistra del risultato 2. scala il risultato di 1 bit a destra 3. scala il moltiplicatore di 1 bit a destra 4. quante volte? n (9)
Moltiplicazione finale (2/3) inizio risultato0 = 1 1 1 a risultato0 = 0 2 3 fine si n volte? no (10)
Moltiplicazione finale (3/3) moltiplicando 32 bit ALU a 32 bit prodotto scrittura scalamento a destra 64 bit controllo (11)
Numeri con il segno Faccio le moltiplicazioni normalmente e mi ricordo i segni Applico le solite regole per determinare il segno Oppure: algoritmo di Booth (12)
(13) Algoritmo di Booth (1/3) Il risultato su 2n bit in cui mettiamo il moltiplicatore e un bit b di controllo posto a 0 1. controllo la cifra più a destra del risultato assieme al bit di controllo (r 0 b) a) se sono 10 allora sottrai dal risultato il moltiplicando (nella parte sinistra) b) se è 11 o 00 allora non fare nulla c) se sono 01 allora somma il moltiplicando alla parte sinistra del risultato 2. scala il risultato di 1 bit a destra ed inserisci r 0 in b 3. quante volte? n
Algoritmo di Booth (2/3) inizio risultato0 = 1 era 0 1 si no 1 a risultato0 = 0 risultato0 = 1 1 risultato0 = 0 1 c 2 (14) fine si n volte? no
Algoritmo di Booth (3/3) moltiplicando 32 bit Uso l ultima versione ALU a 32 bit prodotto scrittura scalamento a destra 64 bit controllo (15)
Perché funziona? a i a i+1 Operazione 0 0 0 1 1 0 1 1 a i+1 a i = { 0 +1-1 Non fare nulla Sommare b Sottrarre b Non fare nulla Non fare nulla Sommare b Sottrarre b (16) Tenete presente che scalare il moltiplicando è come fare x2 k
La divisione Un po più complicata L idea è la solita, sottrazioni successive (17)
Divisione (1/3) Metto 0 nel registro quoziente (32 bit) Metto il divisore nella parte sinistra del registro divisore (64 bit) Metto il dividendo nella parte destra del registro resto (64 bit) 1. Sottraggo il divisore dal resto 2. Controllo il resto a) se è < 0 ripristino il valore originale del resto e scalo di una cifra a sinistra il quoziente (inserendo uno 0) b) se è > o uguale a 0 allora scalo di una cifra a sinistra il quoziente inserendo un 1 3. scala il divisore di 1 bit a destra 4. quante volte? n + 1 (18)
Divisione (2/3) inizio 1 a resto < 0 2 resto 0 2 a 2 b 3 no n +1 volte? si fine (19)
Divisione (3/3) divisore 64 bit scalamento a destra ALU a 64 bit quoziente scalamento a sinistra 32 bit resto scrittura 64 bit controllo (20)
Divisione rivista (1/3) Come prima mi accorgo che il divisore da 32 bit mi basta Scaliamo a sinistra il resto al posto dello scalare a destra il divisore (21)
(22) Divisione rivista (2/3) Metto 0 nel registro quoziente (32 bit) Metto il dividendo nel registro resto (64 bit) 1. Sottraggo il divisore dal resto (i 32 bit alti) 2. Controllo il resto a) se è < 0 ripristino il valore originale del resto e scalo di una cifra a sinistra il quoziente (inserendo uno 0) b) se è > o uguale a 0 allora scalo di una cifra a sinistra il quoziente inserendo un 1 3. scala il resto di 1 bit a sinistra 4. quante volte? n + 1
Divisione rivista (3/3) divisore 32 bit ALU a 32 bit quoziente scalamento a sinistra 32 bit resto scrittura 64 bit scalamento a sinistra controllo (23)
Divisione finale (1/3) avevamo eliminato il moltiplicatore? eliminiamo il quoziente dove lo mettiamo? nel resto (24)
Divisione finale (2/3) inizio scalamento di 1 bit a sinistra del resto sottrarre il divisore dalla metà sinistra del resto e mettere il risultato nella metà sinistra del resto resto < 0 ripristinare valore originale scalare a sinistra resto inserendo 0 resto? resto 0 scalare a sinistra resto inserendo 1 (25) fine scala a destra metà sinistra del resto si n volte? no
Divisione finale (3/3) divisore 32 bit ALU a 32 bit 64 bit scalamento a sinistra scrittura resto scalamento a destra controllo (26)
Come faccio a fare divisioni con il segno? Si fanno le divisioni tra i numeri rappresentati normalmente e poi si mettono i segni corretti nei risultati Attenzione al segno del resto (27)
(28) Virgola mobile.
Sommare due numeri in virgola mobile Allineare la virgola (esponenti uguali) Sommare le mantisse Normalizzare di nuovo, se è necessario Vediamo come (29)
Algoritmo della somma inizio confronta gli esponenti se sono diversi aumenta il minore fino a che non diventano uguali somma le mantisse normalizza la somma (o scalando a destra e incrementando e, o scalando a sinistra e decrementando e) eccezione si problemi? no no normalizzato? arrotondamento mantissa (30) fine si
Vediamo l hardware. complesso. Sign Exponent Significand Sign Exponent Significand Small ALU Compare exponents Exponent difference 0 1 0 1 0 1 Control Shift right Shift smaller number right Big ALU Add 0 1 Increment or decrement 0 1 Shift left or right Normalize Rounding hardware Round (31) Sign Exponent Significand
moltiplicazione Sommo gli esponenti Moltiplico le mantisse Normalizzo Determino il segno (positivo se concordi, negativo altrimenti) (32)
L algoritmo della moltiplicazione inizio somma gli esponenti (sottraendo la costante di polarizzazione) eccezione moltiplica le mantisse normalizza il prodotto (scalando a destra e incrementando e) si problemi? fine no (33) determina il segno no normalizzato? si arrotondamento mantissa
(34) Arrotondamento (in decimale) Fisso il numero di cifre dopo la virgola Devo rappresentare un numero con più cifre dopo la virgola normalizzato considero l ultima cifra rappresentabile considero la prima cifra che non posso rappresentare (cifra di guardia) considero la seconda cifra che non posso rappresentare (cifra di arrotondamento) rappresentabile guardia arrotondamento x 0-4 0-9 x 5 0 x+1 5-9 0-9
E in binario? Dipende, considero o due o tre bit I tre bit dipendono da situazioni particolari Predispongo dell hw per fare questo (35)