Così come rappresentiamo i numeri decimali con la notazione scientifica, possiamo anche rappresentare i numeri binari nella stessa notazione:

1.0 x 2^-1

Una notazione scientifica standard per i reali, nella forma normalizzata, offre tre vantaggi molto importanti. Semplifica lo scambio di tati che comprendono numeri in floating-point; semplifica gli algoritmi relativi all'aritmetica floating-point; aumenta l'accuratezza dei numeri che possono essere memorizzati in una word. Una numero in floating point può essere contenuto in una parola di 32 bit. La rappresentazione di un numero in floating point è illustrata nella figura, in cui s è il segno del numero (1 significa che il numero è negativo), exponent è il valore del campo di 8 bit che contiene l'esponente (incluso il suo segno), e significant è la parte frazionaria del numero. Questa rappresentazione viene detta rappresentazione in segno e ampiezza, visto che il segno ha un bit differente dal resto del numero.



In generale, un numero in floating point si presenta nella forma:



F contiene il valore del campo significant e E contiene il valore nel campo exponent.
Il progettista dell'aritmetica deve trovare un compromesso tra la dimensione del significand e la dimensione dell'exponent, perchè una dimensione fissa della parola significa che è necessario togliere un bit a uno dei due per aggiungerlo all'altro. Il compromesso è tra l'accuratezza e il range rappresentabile: incrementando la dimensione del significant, aumenta il numero di bit per rappresentare il significand, ma incrementanto la dimensione dell'esponente aumenta il range dei numeri che possono essere rappresentati. La scelta della dimensione dell'esponente e del significant da all'aritmetica dei computer uno straordinario range. Frazioni piccole come 2.0 x 10 ^-38 o numeri grandi come 2.0 x 10^38 possono essere rappresentati in un computer. Putroppo, il computer non può rappresentare l'infinito, e quindi è ancora possibile che un numero sia troppo grande per essere rappresentato. Così è possibile che si verifichi un overflow anche nell'aritmetica floating point, così come in quella
intera. Si noti che overflow, nell'aritmetica floating-point, significa che l'esponente è troppo grande per essere rappresentato nel campo corrispondente.
Il floating pint offre un nuovo tipo di evento eccezionale. Così come i programmatori vorranno sapere quando hanno i stanno eseguendo dei calcoli con numeri troppo grandi, essi vorranno sapere se la frazione che stanno calcolando è diventata così piccola da non potere essere rappresentata. Questa situazione si verifica quando l'esponente negativo è troppo grande per essere contenuto nel campo corrispondente. Per contrapporlo all'overflow, molte persone chiamano questo evento underflow.
Per ridurre le possibilità di overflow e underflow, molti linguaggi di programmazione offrono una notazione che ha un campo exponent più grande. In C questa rappresentazione è chiamata double, e le operazioni sui double sono chiamate aritmetica in floating-point a doppia precisione; floating point a singola precisione è il nome della rappresentazione descritta in precedenza.. I numeri in doppia precisione possono essere piccoli come 2.0 x 10^-308 e grandi come 2.0 x 10^308.
La rappresentazione di un floating-point in doppia precisione è illustrata in figura. Essa impiega una double-word, e cioè uno spazio di 64 bit, dei quali s è ancora il bit di segno, exponent è il valore del campo exponente, che diventa di 11 bit, mentre significanta contiene la parte frazionaria del numero, in uno spazio di 52 bit.



Lo standard IEEE 754

I formati appena descritti sono parte dello standard IEEE 754 sui floating-point. L'IEEE (Institute of Electrical adn Electronic Engineers) è uno dei maggiori protagonisti nel mondo degli standard. Oltre a pubblicare centinaia di riviste e tenere numerose conferenze ogni anno l'IEEE ha un gruppo dedicato allo sviluppo di standard nell'area dell'ingegneria elettronica e dell'informatica. Lo standard IEEE 754 ha aumentato sia la portabilità dei programmi sulle varie macchine sia la qualità dell'aritmentica del computer. Per compattare sempre più bit nel significant, IEEE 754 rese il bit di testa,cioè il bit che sta prima del punto decimale ed è 1 nella rappresentazione binaria normalizzata, implicito. Per cui, il significant è effettivamente lungo 24 bit in singola precisione (la parte intera che è 1 più una frazione di 23 bit) e 53 bit in doppia precisione (1+52). Dato che il numero 0 non può avere un bit di testa (il bit prima del punto decimale) uguale a 1, ad esso è stato riservato il valore zero dell'esponente in modo che l'hardware non aggiungerà ad esso il bit di testa 1. Così 00...00 rappresenta il numero 0.
Al resto dei numeri viene invece addizionato il numero 1 (bit di testa prima della virgola) per ottenere il valore reale.



I progettisti dell'IEEE 754 vollero anche una rappresentazione floating-point che fosse adatta per le operazioni di confronto tra i numeri. Questo è il motivo per cui il bit di segno è quello più significativo, permettendo in questo modo di stabilire se un numero è maggiore o minore di zero. Posizionare l'esponente prima del significand ha semplificato di molto l'ordinamento dei numeri floating-point, dato che numeri con esponente maggiore sono più grandi dei numeri con esponente minore.Gli esponenti negativi rappresentano però un problema per il sorting(ordinamento) semplificato. Se usassimo una rappresentazione in complemento a 2 o qualsiasi altra notazione in cui i numeri negativi abbiano un 1 nel bit più significativdel campo exponent, un esponente negativo sembrerebbe un numero grandissimo. Per esempio 1.0 x 2^-1 sarebbe rappresentato come



La notazione desiderabile dovrebbe rappresentare gli esponenti negativi più grandi come 00...000 e quelli positivi come 11...11. Questa notazione viene chaimata biased.

OPERAZIONI CON I FLOATING POINT

1) CONFRONTO: E' l'operazione piu' semplice fra quelle in floating point e viene fatta in maniera differente a seconda del tipo di rappresentazione degli esponenti. Nel caso della rappresentazione classica (non biased notation) l'operazione avviene nel seguente modo:
a) Si confrontano gli esponenti
b) Solamente se gli esponenti sono uguali si confrontano i significand bit e allora il numero inferiore risultera' quello con la parte significand inferiore.
c) Altrimenti, qualora gli esponenti siano diversi, il numero maggiore e' quello con l'esponente maggiore. Si faccia tuttavia attenzione che in questa notazione il primo bit dell'esponente rappresenta il segno. Ne consegue che un esponente il cui primo bit sia posto a 1 rappresenta un esponente minore di uno che inizia per 0.

Es. [ 1 ] [ 1 ][ 0001000 ] [10101010101010101010101]
      |     |       |                   |
      |     |       |                   |
      |     |       |                   |-- significand bits
      |     |       |
      |     |       |---------------------- esponente senza segno
      |     |
      |     |------------------------------ segno dell'esponente
      |
      |------------------------------------ segno del numero

Una rappresentazione alternativa degli esponenti dei floating point e' costituita dalla biased notation.
Il range degli esponenti dei floating point va da -128 a +127. La convenzione della biased notation prevede che al numero binario composto da tutti zero sia associato l'esponente -128 e che invece al numero composto da tutti uno sia associato l'esponente +127. In questo modo e' come se lo zero si trovasse spostato al centoventottesimo posto e quindi vi e' associato il numero 12810 che in binario e' 100000002.
Supposto un esponente in biased notation pari a 100010002 avremo un esponente pari a 100010002 - 100000002 ovvero in decimale 136 - 128 = 8
Lo stesso esponente (10001000) non in biased notation sarebbe stato espresso come 00001000.
2) SOMMA: per poter sommare due floating point questi devono avere lo stesso esponente. Se questa condizione e' verificata il risultato si ottiene sommando i significand e lasciando inalterato l'esponente comune. Se questa condizione non fosse verificata e' necessario trasformare opportunamente il numero con esponente piu' grande in modo che abbia esponente uguale a quello piu' piccolo. Cosi' facendo si ottiene un numero in forma denormalizzata. In generale anche il risultato sara' un numero in forma denormalizzata che quindi andra' successivamente trasformato.
3) MOLTIPLICAZIONE: per moltiplicare due numeri floating point e' sufficiente moltiplicare i significand e sommare gli esponenti (dato che la base della potenza per cui i significand sono moltiplicati e' la stessa). Anche in questo caso pero' possono sorgere dei problemi. Infatti il prodotto dei significand quasi certamente dara' un numero denormalizzato che quindi andra' opportunamente trasformato, inoltre in una moltiplicazione per esempio tra due numeri di 3 cifre il risultato sara' come minimo di cinque cifre. Il numero di cifre del prodotto quindi e' sempre maggiore del numero di cifre di ciascun fattore. Questo porta alla necessita' di effettuare degli arrotondamenti il piu' possibile sensati in modo da non perdere precisione.
4) ARROTONDAMENTI: moltiplicando due numeri a 24 bit dunque ottengo un risultato con 48 bit di precisione. Per evitare i troncamenti che causerebbero gravi perdite di precisione si usa modificare i 24 bit che si prenderanno in considerazione in modo da renderli un poco meno precisi che se si prendessero tutti i decimali, ma un poco piu' precisi che se si troncasse il numero. Questa operazione si chiama nearest rounding. Se per esempio volessimo mantenere solo 8 decimali del numero 1.001000000001 l'approssimazione giusta sarebbe 1.00100000. Nel caso invece di 1.001000001111 e' opportuno approssimare a 1.00100001. Avendo pero' un numero del tipo: 1.0010000010101 e' difficile scegliere se approssimare alla piu'vicina unita' inferiore o superiore. E' lo stesso problema che sorge in base 10 quando la prima cifra dopo l'ultima che possiamo considerare e' un cinque. Finche' questa operazione viene eseguita una sola volta non crea grossi danni, ma ripetendo sempre approssimazioni per eccesso rischierei di avere un risultato incrementato di una unita', di contro ripetendo approssimazioni per difetto rischierei di ottenere un risultato calante di un'unita'. Allora si adotta il metodo del Round To Zero: se l'ultima cifra significativa e' 0 si somma zero, se l'ultima cifra significativa e' 1 si somma 1.