Ad agosto, per il sottoscritto, è ormai tradizione proporre nuovi formati numerici "Floating Point" che vanno contro gli schemi consolidati e non verranno mai implementati (purtroppo!). Non posso esimermi dal farlo anche quest'anno, sia perchè sento l'esigenza di fissare nuove idee o affinamenti prima di dimenticarli, sia perchè in fondo è un bel modo di ingannare il tempo libero estivo, al posto delle solite parole crociate!
Gli articoli da me pubblicati su questo argomento sono ormai almeno una decina (questo, risalente a 8,5 anni fa, è il primo della serie). Mentre all'inizio mi concentravo su come migliorare i formati esistenti ed eventualmente riempirne le lacune, ultimamente mi sto convincendo che ci si dovrebbe svincolare completamente dai limiti imposti in passato, a partire da quello sulla lunghezza delle parole utilizzate. Mi riferisco al volersi limitare alle potenze di due, con formati che quindi contano esattamente 16, 32, 64, 128 bit... Inoltre, credo di avere messo in evidenza il fatto che, generalmente, l'esigenza di manipolare numeri con elevata precisione è slegata da quella di raggiungere valori estremi in termini di esponente (numeri grandissimi o piccolissimi); pertanto è possibile ottimizzare i formati facendo ricorso ad "esponenti estesi" che ampliano la lunghezza dell'esponente con un piccolo sacrificio nella precisione e mantenendo contenuta la lunghezza totale delle parole.
Sulla scia di queste ed altre considerazioni già fatte nei precedenti articoli, mi sono dunque concentrato su quattro standard ottimali, ciascuno perfetto per un certo ambito applicativo. Per agevolarne lo studio, ho realizzato la tabella in apertura dove, una volta fornita la lunghezza della parola da utilizzare e quella dell'esponente di base (colonna e riga), vengono individuate la precisione numerica e l'esponente massimo ottenibile in valore assoluto ma senza il ricorso all'"esponente esteso". Quest'ultimo consente in realtà di estendere notevolmente il range abbracciato ed è per questo che mi sono concentrato su lunghezze di esponente contenute (rispettivamente 6,9,10,11 bit), indicando le mie quattro scelte attuali con delle ellissi rosse. Altre combinazioni interessanti, espresse in articoli precedenti o comunque meritevoli di attenzione, sono indicate con sfondi giallo, arancione e viola mentre i due formati FFP classici (a precisione singola e doppia) hanno uno sfondo grigio. Le caselle lasciate bianche corrispondono a combinazioni poco sensate.
Naturalmente, come in molti standard proposti in passato, questi formati si discostano nettamente da quelli standard per l'assenza dei numeri de-normalizzati; si tratta infatti di una modalità di dubbia utilità che crea peraltro, sui numeri non de-normalizzati, una assurda asimmetria nei valori assoluti di esponente minimo e massimo (il primo risulta più piccolo di una unità rispetto al secondo) in quanto tali numeri sono associati al valore più basso di esponente, ovvero il valore nullo prima dell'applicazione del "bias". Invece, utilizzando soltanto il valore più alto dell'esponente alla codifica di valori non prettamente numerici (±∞ e NaN), rimane un numero dispari di esponenti possibili e si realizza una perfetta simmetria negli esponenti estremi, con il valore nullo al centro!
Per l'esponente esteso, il criterio adottato è arbitrario ma ragionevole e uniforme per tutti i quattro standard proposti. Si tratta di far partire sempre la regione di estensione quando il valore dell'esponente (positivo o negativo) raggiunge i 3/4 del suo valore massimo teorico (di base); in altre parole, il 75% dei valori codificati il formato coincide con quello Floating tradizionale e se ne discosta solo per l'ultimo 25%, quando una porzione di mantissa (i 4 o 7 bit meno significativi, come vedremo tra poco) vengono usati in combinazione con i valori rimanenti di esponente per ampliare il range di quest'ultimo di un fattore 16 o 128, rispettivamente; come vedremo, questo equivale ad aggiungere 2 o 5 bit di esponente, rispettivamente. In verità, i primi tre dei quattro standard che vengono presi in considerazione qui sotto potrebbero benissimo utilizzare un intervallo di base più ampio, riducendo l'esponente massimo esteso ma risultando comunque adatti allo scopo; ne parlo esplicitamente nel caso dello standard a 52 bit ad alta precisione.
Va sottolineato che qui, parlando di mantissa, si intende il "significando" (o "frazione"), includendo anche il bit di segno; sebbene questa partica sia formalmente scorretta, i calcoli sulla precisione numerica forniscono risultati giusti perchè l'esclusione del bit di segno viene compensata dall'utilizzo di un "hidden bit" implicito nella codifica.
Esaminiamo ora, uno per uno, questi nuovi formati, mettendo in evidenza i possibili ambiti di applicazione e le reali potenzialità.
1) Bassa precisione per AI e immagini HDR
In modalità non estesa, la lunghezza di 14 bit con esponente di 6 bit consente una precisione di 2,4 cifre decimali fino ad un esponente massimo pari a 23 in base 2 (circa 7 in decimale). Se l'esponente, in valore assoluto, supera questa soglia, allora 4 bit vengono sottratti dalla porzione meno significativa della mantissa e sono in grado di generare, per ciascuno degli esponenti di base rimanenti (da -31 a -24 e da +24 a +31), altre 16 possibili combinazioni, per un totale di 128 valori positivi e altrettanti negativi. In pratica, nel regime esteso la precisione numerica si dimezza (1,2 cifre decimali) ma l'esponente massimo decimale può superare 38 in valore assoluto, equivalente ad avere 8 bit di esponente classico!
Per la codifica di immagini HDR ad ampia dinamica, come spiegato in questo articolo, la fisiologia impone che non ci siano salti superiori allo 0,4% sulla luminosità di livelli contigui (il cosiddetto "limite di Barten"); invece, la dinamica deve poter arrivare almeno a 40 dB o 4 ordini di grandezza, anche se 6 ordini di grandezza sarebbero l'ideale. Tutto questo, tradotto in digitale, corrisponde ad una precisione numerica di almeno |Log10(0,4%)| = 2,4 cifre decimali e una differenza tra esponente decimale minimo e massimo pari almeno a 4, meglio 6. Entrambi questi requisiti sono perfettamente rispettati dallo standard qui proposto, a patto di rimanere in regime di "esponente base" (non esteso).
Quando invece si parla di reti neurali per applicazioni AI, sempre più richieste, i requisiti sono quelli di una precisione numerica spesso minima ma con una dinamica decisamente più ampia. Ad esempio, il formato Bfloat16 sviluppato allo scopo da Google utilizza 8 bit di esponente e 8 di mantissa, mentre il sistema cfloat8 di Dojo/Tesla arriva ad impiegare solo 2-3 bit di mantissa e 5-6 di esponente! Perciò il formato proposto dovrebbe probabilmente soddisfare anche questo utilizzo.
Per completezza, di seguito si riportano i valori decodificati da questo standard nei due regimi (il nome della codifica esprime, nell'ordine, il numero di bit totali, i bit di esponente base e, dopo la lettera "e", i bit sottratti alla mantissa e usati per codificare l'esponente in regime espanso):
FORMATO: 14/6/e4
REGIME NON ESTESO: precisione di 8 bit (2,41 cifre decimali); valore minimo: 1,19·10-7 (=1/8,4·106) ; valore massimo: 1,67·107
REGIME ESTESO: precisione di 4 bit (1,20 cifre decimali); valore minimo: 2,94·10-39 (=1/3,4·1038) ; valore massimo: 6,38·1038
2) Media precisione per utilizzo didattico
Quando si effettuano calcoli approssimativi, specialmente risolvendo problemi in ambito scolastico, in genere si approssimano i risultati a due o tre cifre significative. Nei calcoli intermedi, tuttavia, raccomando ai miei studenti di usare 4 cifre per mantenere un buon margine di precisione ed è proprio quello che fa anche il sistema qui presentato. In modalità non estesa, la lunghezza è di 24 bit con esponente base di 9 bit, estendibile allo stesso limite di un sistema 11 bit (come quello della doppia precisione) sacrificando 4 bit ovvero poco più di una cifra decimale nel significando; bisogna ammettere che, in questo caso, l'utilità di avere un range così ampio per l'esponente è opinabile mentre il sacrificio di precisione potrebbe essere eccessivo e comunque poco "didattico", per cui si potrebbe anche pensare di lasciare un formato classico con esponente nel range ±77, comunque più che soddisfacente.
FORMATO: 24/9/e4
REGIME NON ESTESO: precisione di 15 bit (4,52 cifre decimali); valore minimo: 3,18·10-58 (=1/3,14·1057) ; valore massimo: 1,67·1057
REGIME ESTESO: precisione di 11 bit (3,31 cifre decimali); valore minimo: 5,56·10-309 (=1/1,80·10308) ; valore massimo: 3,59·10308
3) Alta precisione per un utilizzo generico
La lunghezza è 52 bit con un esponente base di 10 bit, estendibile. Questo non è, in realtà, un formato novo perché l'ho proposto più volte, specialmente in questo articolo. Rimango convinto che, tra tutti i formati FP, sia il più allettante perchè combina una lunghezza di parola contenuta con la massima utilizzabilità in tutte le situazioni più frequenti. In effetti, la precisione di 12 cifre decimali con un ampio margine è perfetta per i calcoli concreti, dato che questa è l'accuratezza massima con cui sono conosciute e misurate le costanti e le grandezze fisiche. Il ricorso ad un esponente esteso di 7 bit, nel concreto, avverrà rarissimamente ma, anche in quella eventualità, la precisione di 10 bit abbondati rimane molto buna, essendo la stessa garantita nella maggior parte delle calcolatrici scientifiche, ma con un esponente che altrimenti richiederebbe ben 15 bit! In effetti, l'esponente esteso è talmente grande che qui si potrebbe pensare di deviare dalla regola del 25%, anche per differenziarlo maggiormente dallo standard seguente; ad esempio, si potrebbe adottare il criterio dello 12,5%, passando all'esponente esteso (±2466 equivalente a 14 bit) solo quando l'esponente di base supera all'incirca 135 in valore assoluto.
FORMATO: 52/10/e7
REGIME NON ESTESO: precisione di 42 bit (12,64 cifre decimali); valore minimo: 5,08·10-116 (=1/1,97·10115) ; valore massimo: 3,94·10115
REGIME ESTESO: precisione di 35 bit (10,54 cifre decimali); valore minimo: 8,41·10-4933 (=1/1,19·104932) ; valore massimo: 2,38·104932
4) Altissima precisione per applicazioni scientifiche
Questo standard, già presentato qui in una sua variante più estrema, garantisce una precisione sovrabbondante da utilizzare solo nelle applicazioni più "spinte", specialmente quelle che hanno a che fare con la misura del tempo e con l'evoluzione dinamica di sistemi potenzialmente caotici, come le orbite planetarie. Difficilmente un calcolo concreto, che non sia di natura puramente matematica, potrà richiedere una precisione maggiore di 20 cifre decimali abbondanti, per non parlare dell'esponente equivalente a 16 bit!
FORMATO: 80/11/e7
REGIME NON ESTESO: precisione di 69 bit (20,77 cifre decimali); valore minimo: 1,29·10-231 (=1/7,76·10230) ; valore massimo: 1,55·10231
REGIME ESTESO: precisione di 62 bit (18,66 cifre decimali); valore minimo: 7,06·10-9865 (=1/1,42·109864) ; valore massimo: 2,83·109864