All’inizio siamo partiti con la codifica in binario e a complemento a due ( utile per fare somme e sottrazioni ) , queste codifiche ci permettono di codificare i numeri interi … ma per i numeri frazionari ? e per i caratteri ? ai Prendiamo per esempio il numero , osserviamo che questo numero sarebbe :
quindi è come se seguiamo un pattern dell’esponente di nelle posizioni del tipo .
Quindi possiamo usare lo stesso pattern di posizioni per i numeri in binario , infatti se consideriamo avremo :
Ok ma il contrario , se voglio esprimere il numero , funziona cosi in pratica :
- si moltiplica per
- se il prodotto è ⇒ mettiamo
- se il prodotto è ⇒ mettiamo
- al prodotto devo levare e ripeto il processo
quindi per il nostro numero otteniamo :
quindi otteniamo che .01100110. Ok ora se ho un numero in decimale dopo la virgola posso codificarlo in binario… ma la virgola come la codifico ?
Una prima idea sarebbe usare una codifica dei numeri frazionari chiamata a virgola fissa ,
ovvero per esempio se abbiamo bit, dedichiamo i primi bit per la parte intera e per la parte frazionaria.
Siccome l’utilizzo della codifica in virgola fissa non è molto conveniente , siccome non riusciamo a lavorare con numeri molto grandi o molto piccoli. Un metodo migliore è usare la notazione scientifica , ovvero invece di scrivere questo numero in questo modo :
è meglio scriverlo in questo modo :
quando utilizziamo una sola cifra prima della virgola , si dice che la notazione scientifica è normalizzata . Quindi possiamo utilizzare lo stesso metodo in binario e infatti possiamo scrivere come :
siccome sappiamo che la parte intera è e la parte dopo la virgola è , quindi avremo , spostiamo ora verso sinistra la virgola di posizioni , quindi otteniamo , ora siccome spostare la virgola di una posizione vuol dire moltiplicare per , dobbiamo “moltiplicare” ( ) per .
Notiamo inoltre che il primo bit prima della virgola sarà sempre , questo perché quando scriviamo in notazione scientifica normalizzata , in decimale il primo numero prima della virgola è un numero , mentre in binario necessariamente potrà essere solo .
Quindi adesso se abbiamo a disposizione bit possiamo dedicare alcuni per l’esponente di , e altri per la mantissa ( la roba dopo la virgola ).
Lo standard IEEE-754 a precisione singola utilizza proprio questa metodologia e prevede bit a disposizione , dove :
- 1 bit per il segno
- 8 bit per l’esponente
- 23 bit per la mantissa
dove il primo bit identifica il segno , se ⇒ positivo e se ⇒ negativo. L’esponente è codificato in eccesso , ovvero che si aggiunge al numero in decimale e poi si codifica in binario ( a bit ).
Per esempio , codifichiamo il numero :
- il primo bit è siccome il numero da codificare è negativo.
- ora dobbiamo scrivere in binario, come abbiamo fatto all’inizio :
- sarebbe :
quindi sarebbe in binario.
- sarebbe :
- quindi avremo che il nostro numero sarà in binario : , ora dobbiamo spostare la virgola di posizioni quindi avremo che in notazione scientifica sarà
- per l’esponente avremo , ora codifichiamo in binario e otteniamo .
- la mantissa l’abbiamo ottenuta prima ed è
quindi il nostro numero diventa secondo lo standard IEEE-754 :
dove nei puntini rimangono gli . In HEX diventa :
ovvero .
Alcune sequenze di bit sono riservate a codificare dei numeri speciali :
- sarebbe lo ( dove può essere o )
- sarebbe
- sarebbe
- una sequenza con i bit dell’esponente tutti a ma quelli della mantissa non tutti ( misti ) , non sarebbe nessun numero ( - Not a Number )
Somma tra due numeri in virgola mobile
Supponiamo dobbiamo fare ⇒ gli steps sono :
- troviamo esponente , mantissa e scriviamo i due numeri e in notazione scientifica normalizzata ( in binario )
- “allineiamo” gli esponenti e decide il più grande
- facciamo la somma tra i due numeri in notazione scientifica
- otteniamo un nuovo numero e da quello ricostruiamo il nuovo numero
- per sapere il segno della somma ( solo se i due numeri hanno segno opposto ) devo confrontare gli esponenti di e e le loro mantisse ( esponenti uguali )
Consideriamo per esempio :
quindi per abbiamo :
- quindi otteniamo che
mentre per abbiamo che :
- quindi otteniamo che
ora dobbiamo allineare secondo , quindi avremo che . Ora facciamo la somma in colonna :
quindi otteniamo , che avrà :
e quindi otteniamo :
Codifica dei caratteri : ASCII - Unicode - UTF-8
Per codificare i caratteri , il primo standard a imporsi è stato la codifica ASCII ( American Standard Code for Information Interchange ) , che usa 7 bit per codificare 128 caratteri ( sarebbe 1 byte → 8 bit e il primo bit a 0 ). Nel mondo però non bastano 128 caratteri ( il cinese ha circa 7000 caratteri ) , quindi è nato lo standard Unicode. In questo standard viene associato ogni carattere un numero compreso tra 0 e 1.114.111 , con in totale caratteri disponibili. Esistono diverse codifiche per utilizzare lo standard Unicode , e i più famosi sono : UTF-8 , UTF-16 , UTF-32. La codifica UTF-8 è una codifica a lunghezza variabile ( adatta la lunghezza al carattere che deve codificare ).
Inoltre è retro-compatibile con ASCII :
- si usa un 1 byte ( 8 bit e il primo a 0 ) e il successivi 7 uguale ad ASCII
Per i caratteri non ASCII , quelle che richiedono più byte , UTF-8 usa una sequenza specifica : dove il primo byte inizia una sequenza di 1 lunga quanto i numeri di byte utilizzati , e il secondo byte inizia con 10 ( sempre ) :
dove "" vengono dedicati per la codifica binaria del numero Unicode che associa al carattere da codificare .