Salta al contenuto
Note per Studenti Esercizio 6 · divisione con una ALU a 8 bit, fattore di scala e serie (temi d'esame gennaio 2021, gennaio 2022, dicembre 2020 e luglio 2026)

Esercizio 6divisione con una ALU a 8 bit, fattore di scala e serie (temi d'esame gennaio 2021, gennaio 2022, dicembre 2020 e luglio 2026)

Esame
In questa pagina 4

Testo (temi d'esame gennaio 2021 problema P1.4, gennaio 2022 P1.4, esercizi del 4 dicembre 2020 problema 3, luglio 2026 problema 1).

(a) Si vuole eseguire la divisione 63:2763:27 in una ALU a 8 bit. Si determini il fattore di scala più conveniente per cui premoltiplicare il dividendo, in modo da avere la migliore accuratezza del risultato, e l'errore relativo che si ottiene una volta riportato il quoziente sulla scala originale. Stessa richiesta per 31:1731:17.

(b) Una ALU a 8 bit esegue la divisione 2174:(−23)2174:(-23). Dare la rappresentazione in complemento a 2 su 8 bit del quoziente e del resto, e il massimo e il minimo valore assoluto che può assumere il divisore.

(c) Si vuole calcolare Q=N/DQ=N/D con N=3N=3, D=2,1D=2{,}1 con l'algoritmo Q=(1+D′)(1+D′2)⋯(1+D′2n−1)1−D′2nQ=\dfrac{(1+D')(1+D'^2)\cdots(1+D'^{2^{n-1}})}{1-D'^{2^n}} con D′=1−DND'=1-\dfrac DN. Determinare: il valore reale di D′D'; il valore di nn che garantisce un'accuratezza superiore a quella offerta da una rappresentazione di QQ a 16 bit; la rappresentazione del risultato su 16 bit nel formato più conveniente; l'errore assoluto commesso.


Teoria usata: Moltiplicatori veloci e divisionePer il controllo real-time serve un moltiplicatore a ciclo singolo: a look-up table (la tabella cresce come $2^{2n}\cdot2n$ bit, quindi si fa solo a pochi bit e si compongono prodotti da 4 bit: $A\cdot B=A_HB_H,2^{8}+(A_HB_L+A_LB_H)2^4+A_LB_L$) oppure a matrice (schiera di AND e sommatori, ritardo $\sim2n$; varianti a somma per colonne e di Wallace). La divisione hardware si fa con sottrazioni successive (con ripristino) su valori positivi e il segno alla fine ($D=Q,d+R$); con $n$ bit ci sono vincoli su dividendo e divisore. Senza divisore hardware: $Q=N/D$ con la serie $\frac{N(1+Z)(1+Z^2)\cdots}{1-Z^{2^n}}$, $D=1-Z$, $0{,}5<D<1$.Moltiplicatori veloci e divisione →, Virgola fissa - formati n.m e normalizzazioneIn virgola fissa il processore fa aritmetica sugli interi (con segno) e il fattore di scalacostante per cui si moltiplica un valore reale per ottenere l'intero memorizzato $2^{m}$ resta sottinteso: il formato n.m dice che dei bit disponibili $n$ sono la parte intera (compreso il segno se il numero è con segno, S; nessun segno se U) e $m$ la parte frazionaria. Il valore è $\text{codice}/2^m$. Passare dal formato n.m al decimale, o viceversa, è il calcolo più frequente dell'esame: su 16 bit $\text{valore}=\text{codice}/2^m$, l'intervallo è $[0,2^n)$ (U) oppure $[-2^{n-1},2^{n-1})$ (S), la risoluzione è $2^{-m}$.Virgola fissa - formati n.m e normalizzazione →.

(a) Fattore di scala

Con una ALU a n=8n=8 bit con segno, quoziente e resto sono nell'intervallo [0,2n−1−1]=[0,127][0,2^{n-1}-1]=[0,127] (il segno si tratta alla fine). Dividere due interi dà un quoziente troncato: 63:27=263:27=2 resto 9, errore relativo −14%-14\%. Per recuperare accuratezza si premoltiplica il dividendo per 2k2^k: qk=⌊63⋅2k/27⌋q_k=\lfloor63\cdot2^k/27\rfloor è il quoziente nella scala 2k2^k (il valore vero è qk/2kq_k/2^k); l'errore di troncamento diventa 12k\frac1{2^k} volte più piccolo. La condizione è che qk≤127q_k\le127 (altrimenti la divisione "non è permessa").

kk dividendo 63⋅2k63\cdot2^k quoziente qkq_k qk/2kq_k/2^k errore relativo
0 63 2 2 −14,3%-14{,}3\%
2 252 9 2,25 −3,6%-3{,}6\%
4 1008 37 2,3125 −0,89%-0{,}89\%
5 2016 74 (resto 18) 2,3125 −0,89%-0{,}89\%
6 4032 149 non ammesso (>127>127) —

Il fattore di scala più conveniente è il massimo che rispetta qk≤127q_k\le127: 25=322^5=\mathbf{32}, con quoziente 7474 e valore riportato in scala 74/32=2,312574/32=2{,}3125; il valore vero è 6327=2,3333\frac{63}{27}=2{,}3333: errore relativo 2,3125−2,33332,3333=−0,89%\frac{2{,}3125-2{,}3333}{2{,}3333}=\mathbf{-0{,}89\%} (per difetto, perché il quoziente è troncato). Il fattore 16 dà lo stesso valore: conviene 32 perché è il limite superiore (il prossimo, 64, dà 149).

31:1731:17 (=1,8235=1{,}8235). k=6k=6: dividendo 19841984, 1984:17=1161984:17=116 resto 12 (116≤127116\le127 ✓); k=7k=7: 233>127233>127 ✗. Fattore di scala 26=642^6=\mathbf{64}; valore 116/64=1,8125116/64=1{,}8125; errore relativo 1,8125−1,82351,8235=−0,60%\frac{1{,}8125-1{,}8235}{1{,}8235}=\mathbf{-0{,}60\%}.

(b) 2174:(−23)2174:(-23)

Il segno si gestisce alla fine, sui moduli: 2174:23=942174:23=94 resto 1212, perché 94⋅23=216294\cdot23=2162 e 2174−2162=122174-2162=12. Il quoziente è negativo (segni discordi): −94-94; il resto ha il segno del dividendo (positivo): +12+12. Deve valere 2174=(−94)⋅(−23)+122174=(-94)\cdot(-23)+12 ✓.

  • Quoziente −94-94 in complemento a 2 su 8 bit: 256−94=162=0xA2=10100010256-94=162=\texttt{0xA2}=\mathbf{10100010}.
  • Resto +12=00001100+12=\mathbf{00001100}.
  • Divisore massimo in modulo: 127127 (limite dei numeri con segno a 8 bit): 2174:127=172174:127=17 resto 15 ✓.
  • Divisore minimo in modulo: il quoziente non può superare 127: 2174∣D∣<128\frac{2174}{|D|}<128, cioè ∣D∣≥2174128=16,98|D|\ge\frac{2174}{128}=16{,}98, quindi ∣D∣≥17|D|\ge\mathbf{17} (con 17: quoziente 127 resto 15; con 16 sarebbe 135, non rappresentabile).

(c) Divisione con il moltiplicatore

Il caso è Q=ND=1D/NQ=\frac ND=\frac1{D/N} con DN=2,13=0,7∈(0,5,1)\frac DN=\frac{2{,}1}3=0{,}7\in(0{,}5,1) (già nel campo richiesto: nessuna premoltiplicazione).

  • (a) D′=1−DN=1−0,7=0,3D'=1-\frac DN=1-0{,}7=\mathbf{0{,}3}.
  • (b) L'errore relativo dell'approssimazione con nn fattori è D′2nD'^{2^n}: n=1n=1: 0,090{,}09; n=2n=2: 8,1⋅10−38{,}1\cdot10^{-3}; n=3n=3: 6,6⋅10−56{,}6\cdot10^{-5}; n=4n=4: 4,3⋅10−94{,}3\cdot10^{-9}. Il risultato è Q=1,428571Q=1{,}428571, da rappresentare su 16 bit in 1.15 U (Q<2Q<2): LSB=2−15=3,05⋅10−5LSB=2^{-15}=3{,}05\cdot10^{-5}, errore massimo di rappresentazione 2−16=1,5⋅10−52^{-16}=1{,}5\cdot10^{-5} (relativo 1,07⋅10−51{,}07\cdot10^{-5}). Perché l'algoritmo non peggiori il risultato serve D′2n<1,07⋅10−5D'^{2^n}<1{,}07\cdot10^{-5}: n=3n=3 dà 6,6⋅10−56{,}6\cdot10^{-5} (non basta), n=4n=4 dà 4,3⋅10−94{,}3\cdot10^{-9} ✓. n=4n=4. Valori parziali: n=3n=3: Qapp=1,428478Q_{app}=1{,}428478; n=4n=4: 1,42857141{,}4285714.
  • (c) Formato più conveniente: 1.15 U: C=round(1,428571⋅32768)=46811=0xB6DBC=\mathrm{round}(1{,}428571\cdot32768)=46811=\texttt{0xB6DB}.
  • (d) Errore assoluto: valore rappresentato 4681132768=1,428558\frac{46811}{32768}=1{,}428558; ∣ε∣=1,3⋅10−5|\varepsilon|=\mathbf{1{,}3\cdot10^{-5}} (eccesso negativo: rappresentato minore del vero).

Errori comuni

  • Premoltiplicare con un fattore troppo grande: il quoziente supera 127 e la divisione non è ammessa.
  • Premoltiplicare con un fattore troppo piccolo (perdita di accuratezza) o dimenticare di dividere per 2k2^k per riportare il risultato in scala.
  • Assegnare al resto il segno del divisore: ha il segno del dividendo (−13:4=−3-13:4=-3 resto −1-1).
  • Applicare la serie quando D/ND/N è fuori da (0,5,1)(0{,}5,1): va riportato nell'intervallo con una potenza di 2.

Versione ripasso

Testo. Divisione a 8 bit: fattore di scala per 63:2763:27 e 31:1731:17; 2174:(−23)2174:(-23); 3/2,13/2{,}1 con la serie (gennaio 2021, gennaio 2022, dicembre 2020, luglio 2026).

Teoria collegata