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 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 .