Operazioni in virgola fissa - somma, prodotto e riallineamento
In questa pagina 4
In un processore a virgola fissa (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 →) l'ALUunità aritmetico-logica: il circuito che esegue somme, prodotti e operazioni logiche esegue somme e prodotti tra interi. Che quegli interi rappresentino frazioni, con una certa virgola implicita, è una convenzione del programmatore: il processore non allineaporta i due dati allo stesso numero di bit frazionari, spostando la virgola implicita le virgole da solo. Questa nota spiega come mantenere coerente la convenzione. Il programmatore deve dichiarare i formati scelti nel codice.
La somma
Due dati e si sommano correttamente solo se : allora . Se i formati sono diversi si allinea il dato con meno bit frazionari spostandolo a sinistra di posti (oppure si sposta a destra l'altro, perdendo risoluzione). Prima di ogni somma conviene chiedersi: "i due addendi hanno lo stesso peso per bit?".
Nella somma c'è anche il problema di overflowrisultato fuori dall'intervallo rappresentabile: dopo la somma di due dati nell'intervallo il risultato può stare in . Si evita con una scelta del formato che lasci un margine (bit interi in più), oppure con l'aritmetica saturatail risultato viene limitato al massimo o al minimo rappresentabile invece di avvolgersi.
Il prodotto
Se e , il prodotto degli interi è Quindi il fattore di scala del prodotto è il prodotto dei fattori di scala: i bit frazionari si sommano. Inoltre il risultato richiede il doppio dei bit (due parole da bit danno un risultato da ): per questo gli acceleratori hardware hanno un accumulatoreregistro a larghezza doppia dove si raccolgono prodotti e somme senza perdere bit a bit.
Per riportare il risultato al formato di un dato con bit frazionari bisogna togliere bit frazionari: uno shiftscorrimento dei bit di una parola verso destra o verso sinistra aritmetico a destra di posti (aritmetico per un valore con segno, per estendere il segno). Se la quantità da togliere è : si prende la parte alta della parola a bit (un'operazione che coincide con uno shift a destra di posti). Questo scarto è un troncamentoeliminazione dei bit bassi senza arrotondare interno all'algoritmo, quindi una piccola fonte di errore (Quantizzazione, fattori di scala e cicli limiteUn algoritmo di filtro o regolatore pensato per un processore ideale va adattato alla realtà: temporizzazionedistribuzione nel tempo delle operazioni di un algoritmo (l'algoritmo nella ISR dell'ADC, durata minore di $T_c$), acquisizione (condizionamento del segnale per sfruttare tutto il fondo scala dell'ADC), fattori di scala (normalizzazione intera o 1.15; evitare overflow), quantizzazione di ingresso, uscita, coefficienti e prodotti (sposta i poli, genera errori a regime e cicli limite). Una frequenza di campionamento troppo alta rende più critica la quantizzazione dei coefficienti: va scelta coerente con la lunghezza di parola.Quantizzazione, fattori di scala e cicli limite →).
Prodotto in normalizzazione 1.15
Con in 1.15 S, , : , cioè il prodotto è in formato 2.30 (il primo bit è di segno esteso). Ma il risultato è ancora una frazione in (salvo il caso ), quindi il formato naturale sarebbe 1.31: si ottiene con uno shift a sinistra di 1. I DSP e molti µC fanno questo shift in automatico nella modalità frazionariafunzionamento del moltiplicatore che dopo il prodotto sposta a sinistra di un bit per riportare il formato 2.30 a 1.31 del moltiplicatore, mentre nella modalità intera non lo fanno. La parte altai W bit più significativi di una parola a 2W bit (bit 31-16) del risultato shiftato è il prodotto in 1.15. Esempio: : (2.30), dopo lo shift (1.31), parte alta ✓.
Esempio con dati senza segno (0.16)
in 0.16 U vale e vale . Il prodotto intero a 32 bit è ; il risultato atteso nella stessa normalizzazionescelta del fattore di scala, cioè di dove sta la virgola, per un dato 0.16 è (). Si ottiene spostando a destra di 16 posizioni: ✓. In generale, premoltiplicaremoltiplicare un coefficiente per una costante prima dell'uso, per renderlo intero due dati per dà un prodotto per ; uno shift a destra di lo riporta a (la scala degli operandi).
Scelta dei fattori di scala
Il problema esiste solo nei processori a virgola fissa. Una scelta sbagliata porta a overflow (di solito rende il codice inutilizzabile) o a un cattivo uso dell'aritmetica (quantizzazionesostituzione di un valore con uno dei valori rappresentabili, con un piccolo errore).
Caso 1: normalizzazione intera. Calcolare con , , (atteso ). Il coefficiente non è rappresentabile come intero: si premoltiplica per una potenza di 2 grande, per esempio 1024, e si arrotonda: (errore di arrotondamento: vale invece di ). Il prodotto vale , in scala : prima di sommare (che è in scala 1) si divide per 1024 con uno shift a destra di 10 posti: . Quindi ✓ (il valore esatto è ). Un fattore di scala grande minimizza l'errore di arrotondamento del coefficiente: se si fosse usato 16, e l'errore sarebbe stato enorme; ma non può essere troppo grande o il prodotto va in overflow.
Caso 2: normalizzazione 1.15. Calcolare con , , (atteso ). Il coefficiente non è rappresentabile in 1.15: si predividedivide un coefficiente per una costante prima dell'uso, per renderlo minore di 1 per una potenza di 2, per esempio 4: . Il prodotto (in 1.15, con ) è ; prima di sommare si moltiplica per 4 (shift a sinistra di 2): ; con si ottiene ✓.
Regole pratiche:
- scegliere normalizzazioni che non diano overflow nel caso peggiore;
- prima di ogni somma, controllare che gli addendi siano in scala uguale;
- dopo ogni prodotto, riportare il risultato al formato dell'accumulatore o del registro di destinazione;
- usare la normalizzazione 1.15 quando possibile: il prodotto di due frazioni è una frazione e non va in overflow; gli interi maggiori di 1 si gestiscono con fattori di scala in potenza di 2 (shift).
Errori comuni
- Dimenticare lo shift dopo il prodotto: il risultato è volte troppo grande.
- Fare lo shift logico al posto dell'aritmetico per un valore negativo.
- Sommare un prodotto non riallineato a un dato in scala diversa.
- Scegliere un fattore di scala piccolo e poi stupirsi dell'errore sul coefficiente.
Versione ripasso
- Somma: stesso ; altrimenti si allinea con shift; attenzione all'overflow (margine di bit interi, saturazione).
- Prodotto: , risultato a bit; si toglie bit con shift aritmetico a destra (parte alta se ).
- 1.15: prodotto in 2.30, shift a sinistra di 1 (modalità frazionaria) e parte alta: . 0.16 U: .
- Scala: , : , , . in 1.15: , poi ×4: .
- Regole: formato dichiarato nel codice, 1.15 quando possibile, scala grande per i coefficienti ma senza overflow (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 →).
- Errori: niente shift dopo il prodotto; shift logico su negativi; somma tra scale diverse.
Esercizi su questo argomento
- Esercizio 3 · calcolo di y = a·x + b e di un polinomio in virgola fissa a 32 bit (temi d'esame gennaio 2026 e settembre 2026)
- Esercizio 19 · realizzazione in C di un filtro con coefficienti maggiori di 1 a virgola fissa (tema d'esame febbraio 2026)
- Esercizio 22 · filtro numerico a 8 bit, coefficienti, prodotti parziali ed errore di troncamento (esercizi del 4 dicembre 2020)
- Esercizio 30 · istruzione MAC con accumulatore a 32 bit e arrotondamento (tema d'esame luglio 2020)
- Esercizio 32 · istruzioni ARM7 con barrel shifter e realizzazione in assembly di y = a·x + b (prove d'esame del 2004 e del 2014)