Divisioni e numeri in virgola mobile ALU (1) a (3 parte) 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) La divisione °Un po’ più complicata…offre la possibilità di un’operazione non valida, la divisione per 0. °L’idea è la solita, sottrazioni successive… (3) Esempio °Divisione….. facciamone una dividendo 1001010 : 1000 -1000 1001 10 101 1010 -1000 10 divisore quoziente Resto (4) Idea L’algoritmo cerca di verificare quanto è grande il numero che può essere sottratto, costruendo il quoziente un bit alla volta, ad ogni tentativo. Quando abbiamo a che fare con 0 e 1 è facile prevedere quante volte il divisore stia nella porzione di dividendo considerata: sarà sempre 0 volte o 1 volta. (5) Prima versione della logica della divisione Ad ogni passo l’algoritmo scala il divisore a destra di una posizione per allinearlo con il dividendo, e quindi si deve iniziare con il divisore messo nella metà sinistra del registro di 64 bit ed eseguire uno scalamento dello stesso di 1 bit. Il registro del resto è inizializzato con il valore del dividendo. (6) Ancora… Diversamente dagli esseri umani il calcolatore non è abbastanza furbo da capire in anticipo se il divisore è più piccolo del dividendo. Deve prima sottrarre il divisore: se il risultato è positivo, il divisore è più piccolo o uguale al dividendo e si genera un 1 nel quoziente. Altrimenti si ripristina il valore iniziale (aggiungendo al resto il divisore) e si genera uno 0 nel quoziente. Il divisore è scalato a destra. (7) 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 (8) Divisione (2/3) inizio 1a resto < 0 resto 0 2 2a 2b 3 no (9) si n +1 volte? fine Divisione (3/3) divisore 64 bit scalamento a destra ALU a 64 bit quoziente scalamento a sinistra 64 bit resto scrittura (10) controllo 32 bit 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 (11) 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 (12) Divisione rivista (3/3) divisore ALU a 32 bit 32 bit quoziente scalamento a sinistra resto scrittura scalamento a sinistra (13) 64 bit controllo 32 bit Divisione finale (1/3) avevamo eliminato il moltiplicatore? eliminiamo il quoziente dove lo mettiamo? nel resto ( si inserisci I vari bit al posto degli 0) (14) Non solo, ma dato che il primo passo dell’algoritmo non può produrre un 1 nel quoziente (il quoziente sarebbe troppo grande), cambiando l’ordine ( prima scalamento e poi sottrazione, si può eliminare un’iterazione dell’algoritmo. Divisione finale (2/3) inizio scalamento di 1 bit a sinistra del resto resto < 0 resto? (15) resto 0 scalare a sinistra resto inserendo 1 ripristinare valore originale scalare a sinistra resto inserendo 0 fine scala a destra metà sinistra del resto sottrarre il divisore dalla metà sinistra del resto e mettere il risultato nella metà sinistra del resto si no n volte? Divisione finale (3/3) divisore 32 bit ALU a 32 bit 64 bit scalamento a sinistra scrittura resto scalamento a destra (16) controllo 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… (17) Virgola mobile…. (18) Sommare due numeri in virgola mobile °Allineare la virgola (esponenti uguali) °Sommare le mantisse °Normalizzare di nuovo, se è necessario… °Vediamo come (19) Algoritmo della somma inizio confronta gli esponenti se sono diversi aumenta il minore fino a che non diventano uguali eccezione si somma le mantisse normalizza la somma (o scalando a destra e incrementando e, o scalando a sinistra e decrementando e) problemi? no no (20) fine normalizzato? si arrotondamento mantissa Vediamo l’hardware…. complesso…. Sign Exponent Significand Sign Exponent Significand Compare exponents Small ALU Exponent difference 0 1 0 Control 1 0 Shift smaller number right Shift right Big ALU 0 1 0 Increment or decrement Sign Exponent Add 1 Shift left or right Rounding hardware (21) 1 Significand Normalize Round moltiplicazione °Sommo gli esponenti °Moltiplico le mantisse °Normalizzo °Determino il segno (positivo se concordi, negativo altrimenti) (22) L’algoritmo della moltiplicazione inizio eccezione somma gli esponenti (sottraendo la costante di polarizzazione) si moltiplica le mantisse normalizza il prodotto (scalando a destra e incrementando e) no fine no (23) problemi? determina il segno normalizzato? si arrotondamento mantissa 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 x x x+1 (24) guardia 0-4 5 5-9 arrotondamento 0-9 0 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 (25)