• Non ci sono risultati.

Capitolo 2

N/A
N/A
Protected

Academic year: 2021

Condividi "Capitolo 2"

Copied!
19
0
0

Testo completo

(1)

Rappresentazione dei numeri nei sistemi di elaborazione

dell’informazione

2.1 Codifica dell’informazione numerica: notazione posizionale

Un problema di importanza fondamentale nella progettazione dei sistemi di elaborazione dell’informazione consiste nella sua rappresentazione. Nel caso di un coprocessore matematico è quindi determinante come vengono rappresentati i numeri all’interno del calcolatore.

Per tradizione secolare, la base di numerazione utilizzata dall’uomo è dieci. I numeri sono comunemente espressi mediante configurazioni finite di simboli, i quali specificano, da sinistra verso destra, l’eventuale segno e le cifre, a partire dalla più significativa. Fra due cifre consecutive può essere inserito il punto (la virgola nella tradizione italiana), a separare le cifre della parte intera da quelle delle parte frazionaria. Ad esempio, un numero di questo tipo è +524.751, in cui + è il simbolo del segno, 524 è la parte intera e 0.751 è la parte frazionaria. Esiste tuttavia la possibilità di esprimere i numeri in altre basi.

La caratteristica più importante del metodo di rappresentazione numerica che siamo abituati ad usare non è la base, ma la notazione posizionale che viene utilizzata. Questo significa che un numero è rappresentato come una successione di simboli e cifre, ma che il valore da attribuire alla singola cifra è legato alla posizione che essa possiede nella rappresentazione del numero. Più esattamente, ad ogni posizione è associato un peso e il valore attribuito alla cifra deriva dal prodotto di tale peso per il valore della singola cifra.

(2)

Ad esempio con la notazione decimale posizionale cui siamo abituati, il

significato di uno dei dieci simboli della base (le cifre

0,1,2,3,4,5,6,7,8,9) dipende dalla posizione di questo all' interno della sequenza di cifre. Il numero 361 va quindi interpretato come :

3 centinaia + 6 decine + 1 unità . Ovvero: 3⋅102 +6⋅101 +1⋅100 .

Se invece di usare le dieci cifre usuali ne usiamo solo due (0 ed 1), avremo la possibilità di una rappresentazione posizionale in base due in cui un numero è costituito unicamente da una sequenza di 0 e 1. Questo tipo di rappresentazione dei numeri prende il nome di notazione binaria.

Ad esempio il numero 11010 va interpretato come:

0 1 2 3 4 1 2 0 2 1 2 0 2 2 1⋅ + ⋅ + ⋅ + ⋅ + ⋅ .

Si ha quindi che 110102 = 2610 , avendo usato il pedice 10 e 2 per la

rappresentazione del numero rispettivamente in base 10 e in base 2.

2.2 Rappresentazione dei numeri

La maggior parte degli attuali sistemi digitali adotta il sistema di numerazione binaria su n bit, vediamo quindi come in essi vengono rappresentati i numeri con segno. Le rappresentazioni più usate sono tre :

• Modulo e segno. • Complemento a 2. • Complemento a 1.

(3)

2.3 Rappresentazione in modulo e segno

Nella rappresentazione modulo e segno, se il numero dei bit disponibili per rappresentare il numero N è pari a n, il bit in posizione più significativa è riservato alla rappresentazione del segno. Per mantenere la consistenza della rappresentazione nella base scelta, anche il segno viene rappresentato con una cifra nella stessa base: il segno positivo viene rappresentato come 0, mentre il segno negativo viene rappresentato come 1. Come esempio si

consideri il numero 6 . Per la sua rappresentazione binaria in modulo e

segno occorrono 4 bit, con il bit più significativo che rappresenta il segno:

e . Questo tipo di rappresentazione è ridondante

perché permette due diverse rappresentazioni per il valore zero: 00……0 e 10……..0 . Fissato il numero n di bit (compreso il segno), il campo dei numeri rappresentabili è simmetrico, e risulta costituito da tutti gli N tali

che: e la codifica del numero –N si ottiene

immediatamente da quella di +N semplicemente cambiando il bit del segno. La rappresentazione in modulo e segno sembra quella più naturale perché, nei nostri calcoli manuali, siamo abituati a trattare con valori decimali espressi in modulo e segno. Questa rappresentazione risulta però scomoda nel caso di calcolo automatico, infatti ogni somma algebrica richiede l’esecuzione delle seguenti operazioni:

10 1110 2n−1 2 10 0110 6 = + 2 1 − n− 2 10 6 = − 1 − ≤ ≤ N 1 −

• Controllare il segno dei due operandi.

• Se i due segni sono diversi, confrontare i valori assoluti e sottrarre il minore dal maggiore.

• Se i due segni sono uguali, sommare i valori assoluti. • Premettere al risultato il segno corretto.

(4)

A parte il maggior tempo richiesto da questo insieme di operazioni che non possono essere contemporanee (rispetto al caso di una singola operazione), il circuito aritmetico che realizza l’operazione risulta relativamente complesso perché deve comprendere un addizionatore e un sottrattore separati. Sarebbe utile trovare una rappresentazione che consenta di eseguire la somma algebrica in un unico passo e senza richiedere diversi circuiti aritmetici. Per questa ragione si ricorre alla rappresentazione in complemento.

2.4 Rappresentazione in complemento a 2

La rappresentazione in complemento a 2, di un numero N su n bit, si

ottiene direttamente dalla differenza , che viene appunto definito

complemento a 2. Ad esempio per rappresentare − occorrono 4 bit e

risulta : 2 . Questo tipo di notazione non è

ridondante perché lo zero ha un’unica codifica possibile (00…00) e il campo dei numeri rappresentabili è asimmetrico poiché risulta costituito da

tutti gli N tali che: − . Apparentemente la notazione in

complemento a 2 non porta a nessun vantaggio dato che la complementazione richiede ancora una sottrazione. Si può però facilmente verificare che dato un numero N di n bit, il suo complemento a 2 si ottiene invertendo tutti i bit del numero e sommando poi 1 al bit meno significativo. Si può quindi ricavare una regola pratica per ottenere in modo veloce il complemento a 2 di un numero: partendo dal bit meno significativo e procedendo verso sinistra, si lascino immutati tutti i bit fino al primo 1 incluso e si complimentino tutti i bit successivi. Il maggior vantaggio della rappresentazione in complemento a 2 sta nel fatto che il risultato della sottrazione tra due numeri può essere ottenuto facendo la somma del primo numero con il complemento a 2 del secondo:

N n 2 10 6 2 2 2 4 − N =10000 0110 =1010 1 2 2n−1 N n−1

(5)

) ( ) (ab = a+2b 2 ( ) 2 ( n a + n b

. L’adozione della notazione in complemento a 2 richiede naturalmente di gestire opportunamente le operazioni di somma. In particolare, la somma di parti frazionarie con stesso segno porta a codifiche prive di significato qualora il valore assoluto di tale somma sia ≥ 1. Si deve quindi verificare che la somma di due parti frazionarie positive non dia luogo ad una codifica negativa (generazione di overflow) e allo stesso modo che la somma di parti frazionarie negative non dia luogo ad una codifica positiva (generazione di underflow) Il discorso fatto per le parti frazionarie si può facilmente estendere a i numeri (interi o frazionari) rappresentabili con un predefinito numero di bit. Se si considera l’operazione di somma algebrica di due numeri di n bit dotati di segno e rappresentati in complemento a 2 , si verifica facilmente che il risultato N della semplice addizione è corretto a patto che cada nel campo dei valori

rappresentabili con il numero di cifre dato (cioè ) , pur di

trascurare l’eventuale riporto in uscita del bit più significativo. Infatti, siano i due operandi a e b di n bit; se sono entrambi positivi, è evidente che il risultato è immediatamente corretto. Se invece a è negativo e b è positivo, l’operazione di somma algebrica con rappresentazione in complemento a 2

diventa in realtà . Questo però, a patto di ignorare l’eventuale

riporto fornito in uscita dal bit più significativo, costituisce esattamente il risultato che si desiderava (il cui valore rientra certamente nel campo di rappresentabilità). Se poi entrambi i numeri sono negativi, si ha

, cioè ancora una volta il risultato corretto, sempre a patto di ignorare l’eventuale riporto fornito in uscita dal bit più significativo.

1 2 2 1 1 nN nb a n − )+ 2 ( )

(6)

Si considerino ora i seguenti due esempi di numeri rappresentati con 6 bit: R 1 0 1 1 0 a 0 1 0 0 1 0 1810 b 0 1 0 1 1 0 2210 a+b 1 0 1 0 0 0 R 0 1 1 1 0 a 1 0 1 1 1 0 −1810 b 1 0 1 0 1 0 −2210 a+b 0 1 1 0 0 0

Il primo esempio corrisponde alla somma 18 il cui risultato corretto

sarebbe , il risultato ottenuto è errato e viene invece interpretato come

. Il secondo esempio corrisponde alla somma di , il cui

risultato corretto sarebbe , che genera il risultato errato . In

entrambi i casi i risultati ottenuti sono errati perché quelli corretti escono

dai limiti di rappresentabilità: è infatti , e i numeri rappresentabili

vanno da a , cioè da a 31 . Generalizzando si può

concludere che si ha superamento di capacità se, sommando due numeri positivi si ottiene un risultato negativo (generazione di overflow), oppure se sommando due numeri negativi si ottiene un risultato positivo (generazione di underflow). Nel caso di somma algebrica di due numeri di diversa lunghezza, occorre allineare i numeri a partire dal bit meno significativo (più a destra) e completare quello più corto aggiungendo a sinistra k cifre tutte identiche alla sua ultima cifra, essendo k la differenza di cifre tra i due numeri. Tale operazione è definita estensione del segno. La semplicità logica e la velocità dell’operazione di somma algebrica dei numeri dotati di segno, rappresentati in complemento a 2, sono i principali motivi per i quali questa notazione è adottata nelle unità aritmetico-logiche dei moderni sistemi di elaborazione dell’informazione.

10 10+22 6 = n 10 10 40 − 10 24 − −1810 +(−2210) 24 10 40 − 10 5 2 25 1 10 32 −

(7)

2.5 Rappresentazione in complemento a 1

La rappresentazione in complemento a 1, di un numero N su n bit, si ottiene invertendo ogni singolo bit del numero. Nel caso binario tale

rappresentazione coincide con il risultato dell’operazione ,

chiamata appunto complemento a 1. Si tratta di una notazione ridondante perché lo zero ha due codifiche, una per +0 e una per –0. Il campo dei numeri rappresentabili è simmetrico poiché risulta costituito da tutti gli N

tali che: − . Si consideri ora il caso di somma algebrica

di due numeri a e b rappresentati in complemento a 1. I due addendi siano

tali che il risultato non superi in valore assoluto . Se entrambi i

numeri sono positivi, è ovvio che il risultato è immediatamente corretto. Supponiamo ora che b sia negativo ed a positivo. L’operazione diventa:

N n − )1 2 ( 1 2 1 2n−1 N n−1 1 2n−1

(

2 1

)

b=ab+

(

2n −1

)

+ n

a . Ma questo è il risultato corretto solo se ba ;

in tal caso, infatti, si ottiene:

(

2n −1

)

(

ba

) 1 +

n

)

e, come è facile verificare, non

si ha riporto nella posizione ( . Se invece ≤ a

) 1 − b ) 1 (n+ ba , il risultato non è

corretto perché si ottiene: invece del valore

corretto . Si ha cioè un riporto in posizione , vale a dire in

posizione superiore agli n bit rappresentabili, mentre il risultato negli n bit rappresentabili ha un errore per difetto pari a 1. Si può correggere questo errore sommando il valore 1 di riporto nella posizione meno significativa del risultato (end-around carry). Consideriamo infine la somma di due

numeri negativi: si ha . Si deve perciò ripetere la

stessa correzione del caso precedente per ottenere il risultato corretto . Si può concludere quindi assegnando la regola di sommare al risultato, nella posizione meno significativa, il riporto della somma al fine di ottenere il risultato corretto in complemento a 1.

( 2n + b ) ( ) 1 + + = − a b a+ n − (2 1) ) 1 2 ( n ) (ab n 2 ( ) (a+b ) 1 2 ( n

La rappresentazione in complemento a 1, anche se più facile da ottenere, richiede però un tempo di esecuzione della somma algebrica tra due numeri

(8)

maggiore rispetto alla rappresentazione in complemento a 2. Per questo motivo, nella realizzazione dei sistemi di elaborazione viene utilizzata la rappresentazione in complemento a 2.

La tabella 2.1, per riassumere, riporta la rappresentazione binaria su 4 bit dei numeri interi con segno nelle tre modalità prima viste.

Valore rappresentato Valore binario 0 1 2 3b bb b Notazione modulo e segno Notazione complemento a 2 Notazione complemento a 1 0000 + 0 0 + 0 0001 + 1 + 1 + 1 0010 + 2 + 2 + 2 0011 + 3 + 3 + 3 0100 + 4 + 4 + 4 0101 + 5 + 5 + 5 0110 + 6 + 6 + 6 0111 + 7 + 7 + 7 1000 - 0 - 8 - 7 1001 - 1 - 7 - 6 1010 - 2 - 6 - 5 1011 - 3 - 5 - 4 1100 - 4 - 4 - 3 1101 - 5 - 3 - 2 1110 - 6 - 2 - 1 1111 - 7 - 1 - 0

Tabella 2.1 Rappresentazioni binarie su 4 bit di numeri interi con segno

L’ultima considerazione che si può fare alla luce della tabella precedente è questa: nella rappresentazione binaria, in tutti e tre i metodi, il bit più significativo vale 0 per i numeri positivi e vale 1 per quelli negativi. I valori positivi hanno la stessa rappresentazione in tutti e tre i metodi, mentre i valori negativi sono rappresentati in modo diverso.

(9)

2.6 Rappresentazione in virgola fissa e in virgola mobile

Abitualmente, nelle CPU (Central Processing Unit) e nelle unità aritmetiche commerciali per quanto riguarda i numeri interi positivi si ricorre alla notazione binaria su n bit già vista. Per quanto riguarda i numeri interi dotati di segno, abbiamo visto che le notazioni più diffuse di rappresentazione sono quella in modulo e segno e quella in complemento a 2. La rappresentazione in complemento a 2 è di gran lunga la più usata per l’aritmetica su numeri interi oppure “in virgola fissa”, mentre la notazione in modulo e segno trova applicazione nell’aritmetica “in virgola mobile”. La notazione con virgola in posizione fissa (virgola fissa) e quella con virgola in posizione mobile (virgola mobile) sono entrambe usate per la rappresentazione dei numeri reali.

Nella notazione con virgola in posizione fissa, se tutti i numeri su cui si deve operare hanno la stessa forma (per esempio con la virgola in terza posizione da destra), tutte le operazioni aritmetiche saranno eseguite come se i numeri fossero interi: algoritmi e circuiti aritmetici sono quelli validi per la rappresentazione intera.

Il risultato dovrà però tener conto della posizione della virgola: per esempio la somma di due numeri di sette bit (fatta come se si operasse su interi) può fornire un risultato di otto bit, con la virgola sempre in terza posizione, mentre il prodotto di due fattori, per esempio di sette bit, fornisce invece un risultato di quattordici bit con la virgola in sesta posizione.

Nella notazione con virgola in posizione mobile, si prevede invece la virgola in posizione variabile e determinata dal valore dell’esponente: un numero N espresso in base B viene rappresentato in forma logaritmica : , dove E è l’esponente e M la mantissa. Lo scopo principale nell’uso dei numeri in virgola mobile è quello di poter rappresentare numeri molto piccoli (esponenti negativi con valore assoluto

E

B M

(10)

grande) e molto grandi (esponenti positivi molto grande). Un problema della rappresentazione in virgola mobile è quello della compatibilità fra le rappresentazioni adottate dai diversi produttori di circuiti o di CPU. Per quanto riguarda la precisione occorre tenere presente che esistono dei limiti precisi alla rappresentabilità dei numeri, dovuti alle dimensioni dei registri, dell’unità aritmetica e delle parole di memoria. Il numero fisso e ridotto di bit utilizzabili fa sorgere quindi, nelle diverse operazioni, il problema dell’overflow e dell’underflow che però possono essere identificati e trattati in modo opportuno (in genere si segnala al sistema operativo come una “eccezione”). Un ultimo problema che riguarda la precisione è quello della gestione degli errori, intendendo con errore un risultato non esatto dovuto al limitato numero di bit.

2.7 Rappresentazione in virgola mobile

Un numero N in virgola mobile (espresso in una base B) può essere

rappresentato nella seguente forma : , dove M è la

mantissa ed E è l’esponente del numero. Questo numero può essere memorizzato in una parola binaria di tre campi :

E

B M

N = ± ⋅ ±

• Segno: più o meno . • Mantissa: M .

• Esponente: E .

La base B è implicita e quindi non deve essere memorizzata perché è la stessa per tutti i numeri.

(11)

Si ricorre a questa rappresentazione (in inglese floating point) sia per poter definire numeri variabili in un campo di valori molto grande senza dover utilizzare un elevato numero di bit, sia per ottenere una coincidenza con il significato di numero reale nei più comuni linguaggi di programmazione. La figura 2.1 mostra un tipico formato a 32 bit in virgola mobile :

ESPONENTE MANTISSA Segno della Mantissa 1 bit 8 bit 23 bit

Figura 2.1 – Tipico formato di numeri in virgola mobile a 32 bit

Assumiamo che la base sia 2, non è presente nella figura perché non va memorizzata. Il bit più a sinistra memorizza il segno del numero (0 per numero positivo, 1 per numero negativo). Il valore dell’esponente è memorizzato nei successivi 8 bit della rappresentazione. L’esponente, che può essere negativo o positivo, viene rappresentato normalmente in forma polarizzata, ossia si somma al valore vero dell’esponente un numero tale da rendere nullo il massimo esponente negativo. Tipicamente il numero di

polarizzazione vale ( , dove k è il numero di bit dell’esponente. Nella

figura, gli 8 bit del campo coprono un intervallo che va da 0 a 255, ma con una polarizzazione di 127, i valori dell’esponente giacciono su un intervallo che va da –127 a 128. Questo tipo di rappresentazione ha il vantaggio di consentire di fare confronti tra due numeri in virgola mobile utilizzando l’aritmetica dei numeri interi, rendendo molto più semplice l’operazione. Infatti fare confronti tra due numeri con esponenti rappresentati con segno e valore o con i complementi è più complesso, in quanto bisogna separare le diverse parti e fare confronti parziali. Invece se si rappresentano i numeri in virgola mobile con il formato descritto nella figura e con gli esponenti

) 1 2k−1

(12)

polarizzati, la relazione di maggiore o minore che vige tra due numeri rimane valida anche se assumiamo che le due stringhe rappresentino due numeri interi, rappresentati con segno e valore assoluto. La parte finale della parola (in questo caso 23 bit) è la mantissa. La mantissa è rappresentata solitamente in valore assoluto. Se il bit più significativo della mantissa è 1 essa si dirà normalizzata.

Per semplificare le operazioni sui numeri in virgola mobile, si richiede tipicamente che questi sia normalizzati. Un numero non nullo normalizzato assume la forma :

E

b

bbbb

±

±

0

,

1

....

2

dove b è una cifra binaria (0 o 1). Questo implica che la mantissa è sempre normalizzata, ha sempre il bit più significativo pari a 1 e quindi non è necessario memorizzarlo in quanto implicitamente presente. In questo modo, il campo a 23 bit può memorizzare in realtà una mantissa di 24 bit con valori tra 0,5 e 1.

Alcuni esempi di numeri memorizzati in questo formato sono i seguenti :

0,1101001 • 210100 = 0 10010011 10100010000000000000000

-0,1101001 • 210100 = 1 10010011 10100010000000000000000

0,1101001 • 2−10100 = 0 01101011 10100010000000000000000

-0,1101001 • 2−10100 = 1 01101011 10100010000000000000000

Si notino le seguenti caratteristiche :

• Il segno è memorizzato nel primo bit della sequenza.

• Il primo bit della mantissa è sempre 1 e quindi non necessita che sia immagazzinato nel campo della mantissa.

• Il valore 127 è aggiunto al vero valore dell’esponente e memorizzato nel campo dell’esponente.

(13)

Con questo formato in virgola mobile sono rappresentabili i seguenti intervalli di numeri:

• Numeri negativi tra (12−24)2128 e 0,52−127 .

• Numeri positivi tra 0,52−127 e (12−24)2128 .

Restano invece scoperti cinque intervalli che sono :

• Numeri negativi minori di −(12−24)2128 , detti overflow negativo.

• Numeri negativi maggiori di 0,52−127 , detti underflow negativo.

• Lo zero.

• Numeri positivi minori di 0,52−127 , detti underflow positivo.

• Numeri positivi maggiori di (12−24)2128 , detti overflow positivo.

Zero Overflow negativo Numeri negativi esprimibili Underflow negativo Underflow positivo Numeri positivi esprimibili Overflow positivo −(12−24)2128 0,52−127 0 0,52−127 (12−24)2128

Figura 2.2 – Campo di rappresentazione dei numeri in virgola mobile

Così come presentata, questa notazione non lascia spazio per un valore dello zero, ma le attuali rappresentazioni per i numeri in virgola mobile comprendono una sequenza speciale per lo zero. L’overflow avviene quando il risultato di un’operazione aritmetica è di una grandezza che non

può essere espressa con un esponente di 128 (ad esempio ),

mentre l’underflow avviene quando la grandezza della parte frazionale è

troppo piccola (ad esempio 2 ). Tuttavia l’underflow è un

problema meno serio dell’overflow in quanto il risultato può generalmente essere approssimato a zero in maniera soddisfacente.

250 130 120 2 2 2 ⋅ = 250 130 120 22− − =

(14)

È importante notare che i numeri rappresentati in virgola mobile non sono distanziati uniformemente lungo la retta reale come lo sono i numeri in virgola fissa. I valori rappresentabili sono più compatti vicino all’origine e si diradano sempre più man mano che ci si allontana da questa :

0 n n • 2 n • 4

Figura 2.3 - Densità dei numeri in virgola mobile

Questo è un dei compromessi della matematica in virgola mobile: molti calcoli producono risultati che non sono esatti e devono essere arrotondati al valore più vicino che la notazione può rappresentare.

Nel tipo di formato descritto in figura 2.1, c’è un compromesso tra l’intervallo di rappresentazione e la precisione e l’esempio mostra una rappresentazione in cui vengono dedicati 8 bit per l’esponente e 23 bit per la mantissa. Se si incrementasse il numero di bit nell’esponente, verrebbe espanso l’intervallo di rappresentazione, ma poiché possono essere espressi soltanto un numero fisso di valori diversi, verrebbe ridotta la densità di questi numeri e, quindi, la precisione. Il solo modo per aumentare sia l’intervallo di rappresentazione che la precisione è usare più bit. Per questo motivo, molti calcolatori forniscono per lo meno numeri a precisione singola e numeri a precisione doppia: ad esempio, un formato a precisione singola potrebbe usare 32 bit, mentre uno a precisione doppia ne potrebbe usare 64. Quindi c’è un compromesso tra il numero di bit nell’esponente ed il numero di bit nella mantissa.

(15)

2.8 Standard IEEE per la rappresentazione dei numeri binari in virgola mobile

I principali problemi posti dalla rappresentazione dei numeri in virgola mobile sono :

• Rappresentazione non biunivoca (ad un numero N corrispondono più coppie mantissa-esponente).

• Definizione della mantissa (posizione della virgola, segno del numero).

• Determinazione del numero di bit destinati alla mantissa e all’esponente (incide sulla precisione e sull’intervallo della rappresentazione).

Se le convenzioni di rappresentazione adottate da diversi produttori di microprocessori sono diverse (in particolare, se cambiano la posizione della virgola per la mantissa, il numero di bit riservati a mantissa ed esponente, ecc.), dati identici elaborati da sistemi digitali con le stesse funzionalità ma di produttori diversi potrebbero portare a risultati diversi, in conseguenza delle diverse approssimazioni che si potrebbero rendere necessarie.

Per ovviare a questo problema, nel 1985 l’associazione IEEE (Institute of Electrical and Electronic Engineers) ha definito un formato standardizzato (IEEE 754-1985) al quale i progettisti sono invitati a conformarsi. Lo standard è stato adottato su larga scala ed è usato, in sostanza, su tutti i processori e coprocessori aritmetici contemporanei.

(16)

ESPONENTE MANTISSA

Segno della Mantissa

1 bit 8 bit 23 bit

(a) Formato singolo

ESPONENTE MANTISSA Segno della Mantissa 1 bit 11 bit 52 bit (b) Formato doppio

Figura 2.4 – Formati IEEE 754

Lo standard IEEE definisce sia un formato a precisione singola a 32 bit, che un formato doppio a 64 bit (si veda la figura 2.4) con un esponente ad 8 bit e 11 bit, rispettivamente, e con la base implicita pari a 2. In aggiunta, lo standard definisce due formati estesi per la precisione singola e doppia, il cui formato esatto dipende dall’implementazione. I formati estesi includono bit addizionali nell’esponente (intervallo di rappresentazione esteso) e nella mantissa (precisione estesa) ed il loro uso deve essere circoscritto ai calcoli intermedi. Con la loro maggior precisione, i formati estesi riducono la possibilità di contaminare il risultato finale con errori dovuti ad eccessivo arrotondamento mentre, con il loro intervallo di rappresentazione più grande, riducono anche la possibilità che un overflow intermedio possa far interrompere un programma il cui risultato finale è rappresentabile nel formato di base. Un’altra motivazione per usare il formato a precisione singola esteso è che esso permetto alcuni benefici del formato doppio senza incorrere nelle penalizzazioni sul maggior tempo di calcolo associato a precisioni maggiori. La tabella 2.2, nella pagina seguente, riassume le caratteristiche dei 4 formati.

(17)

Poiché la mantissa normalizzata comincia sempre con un 1 seguito da una virgola binaria, e poi a seguire il resto delle cifre, lo standard prevede l’assenza del primo bit a 1 e della virgola binaria, perché dati per impliciti, ovvero, sempre presenti.

Formato Parametri Precisione

singola singola estesa Precisione Precisione doppia doppia estesa Precisione

Ampiezza parola (bit) 32 ≥ 42 64 ≥ 79

Ampiezza esponente (bit) 8 ≥ 11 11 ≥ 15

Fattore di polarizzazione dell’esponente 127 Non specificato 1023 Non specificato Esponente massimo 127 ≥ 1023 1023 ≥ 16383 Esponente minimo -126 ≤ -1022 -1022 ≤ -16382 Intervallo di rappresentazione (base 10) 38 10− 38 10+ , Non specificato 308 10− , 10+308 Non specificato

Ampiezza della mantissa (bit)

non è incluso il bit implicito 23 ≥ 31 52 ≥ 63

Numero di esponenti 254 Non

specificato 2046 Non specificato Numero di frazioni (mantisse) 23 2 Non specificato 52 2 Non specificato Numero di valori 1,98231 Non

specificato 52 2 99 , 1 ⋅ Non specificato Tabella 2.2 – Parametri dello standard IEEE 754

Non tutte le sequenze di bit nei formati IEEE sono interpretati nel modo consueto, in quanto alcune sequenze di bit sono usate per rappresentare valori speciali. La tabella 2.3 indica i valori assegnati a varie sequenze di bit: i valori estremi dell’esponente formati da tutti zeri (0) e tutti uno (255 nel formato a precisione singola , 2047 nel formato a precisione doppia) definiscono valori speciali.

(18)

Sono rappresentate le seguenti classi di numeri:

• Per valori dell’esponente nell’intervallo tra 1 e 254 per il formato a precisione singola e tra 1 e 2046 per il formato a precisione doppia, sono rappresentati i numeri normalizzati in virgola mobile non nulli. L’esponente è polarizzato così che l’intervallo dell’esponente è tra – 126 e +127 in precisione singola e tra –1022 e +1023 in precisione doppia. Un numero normalizzato richiede un bit a valore 1 alla sinistra della virgola; questo bit è implicito e quindi i bit effettivi della mantissa (nello standard viene chiamata frazione) sono 24 (precisione singola) o 53 (precisione doppia).

• La sequenza con esponente e mantissa con tutti i bit impostati a zero rappresenta lo zero positivo o negativo a seconda del valore del bit di segno. Come già accennato, può essere utile una rappresentazione esatta dello zero.

• La sequenza con esponente con tutti i bit impostati a uno e mantissa zero rappresenta l’infinito positivo o negativo a seconda del valore del bit di segno. Anche una rappresentazione dell’infinito può tornare utile in quanto lascia la possibilità all’utente di decidere se trattare l’overflow come una condizione di errore oppure proseguire con questo valore (e continuare con qualunque cosa il programma abbia prodotto).

• Un esponente di zeri insieme con una mantissa non nulla rappresenta un numero denormalizzato. In questo caso, il bit alla sinistra della virgola è zero ed il vero valore dell’esponente è –126 oppure –1022. Il numero è positivo o negativo a seconda del bit di segno.

• Un esponente di tutti uno insieme con una mantissa non nulla ha il valore NaN (non numerico, Not a Number) e viene usato per segnalare varie condizioni di eccezione.

(19)

Precisione singola (32 bit) Precisione doppia (64 bit) Segn

o

Esponente

polarizzato Man-tissa Valore Segno polarizzato Esponente Man-tissa Valore

Zero positivo 0 0 0 0 0 0 0 0

Zero negativo 1 0 0 -0 1 0 0 -0

Più infinito 0 255 (tutti 1) 0 ∞ 0 2047 (tutti 1) 0 ∞ Meno infinito 1 255 (tutti 1) 0 −∞ 1 2047 (tutti 1) 0 −∞

NaN silenzioso 0 o 1 255 (tutti 1) ≠0 NaN 0 o 1 2047 (tutti 1) ≠0 NaN NaN di

segnalazione 0 o 1 255 (tutti 1) ≠0 NaN 0 o 1 2047 (tutti 1) ≠0 NaN Positivi

normaliz-zati non nulli 0 0 < E < 255 f 2E−127(1, f) 0 0 < E < 2047 f 2E−1023(1,f)

Negativi

normaliz-zati non nulli 1 0 < E < 255 f 2E−127(1, f) 1 0 < E < 2047 f 2E−1023(1, f)

Positivi

denormalizzati 0 0 f ≠0 2E−126(1,f) 0 0 f 0 2E−1022(1,f)

Negativi

denormalizzati 1 0 f ≠0 2E−126(1, f) 1 0 f 0 2E−1022(1, f)

Tabella 2.3 – Interpretazione dei numeri in virgola mobile IEEE 754

Bibliografia

[2.1] Franco Fummi, Maria Giovanni Sami, Cristina Silvano, “Progettazione digitale”, febbraio 2002.

Per i paragrafi 2.1, 2.2, 2.3, 2.4, 2.5, 2.6.

[2.2] William Stallings, “Architettura e organizzazione dei calcolatori” Per i paragrafi 2.7 e 2.8.

Riferimenti

Documenti correlati

o poiché il resto è sempre minore del divisore, e quindi esiste soltanto un numero finito di resti possibili, prima o poi dovrà per forza ripresentarsi un resto identico ad uno

Per fare ciò pare assolutamente necessario che l’attuale struttura del DPCM 26 aprile 2020, imperniato su regole previste rigidamente in funzione della sola

Stipendio tabellare Posizione parte fissa Posizione parte variabile Retribuzione di risultato Altro* TOTALE ANNUO LORDO. € 55.397,39 € 36.299,70 € 72.599,40 € 21.779,82

Ravvisata la necessità di procedere ad affidare il servizio di realizzazione del progetto mediante espletamento di gara da effettuarsi con procedura aperta secondo il criterio

Al termine, una volta scritto il risultato, conta quante cifre ci sono dopo la virgola sia nel moltiplicando che nel moltiplicatore: nel risultato separa con la virgola le

Appena arrivato a destinazione presi il mio zainetto che conteneva tanti oggetti, infatti c’erano la merenda, il taccuino, la biro, la macchina fotografica ed una

La sogliola si difende mimetizzandosi sul fondoF la seppia secerne un liquido nero che intorbida l’acquaF il pesce spada lotta con la sua lama affilata. Nel mio astuccio ci

La conversione in binario pu` o essere interrotta una volta ottenute 24 cifre totali (comprensive di parte intera e parte frazionaria, considerando il bit nascosto) oppure una