IEEE 754r
# IEEE 754r

L'IEEE 754r è il progetto di revisione dello standard per il calcolo in virgola mobile IEEE 754. Lo scopo è rivedere lo standard là dove è diventato obsoleto, di definire alcune zone d'ombra lasciate dal precedente lavoro e di unirlo nell'IEEE 854 (lo standard per il calcolo in virgola mobile non posizionale).

Nel caso in cui delle definizioni più rigide siano impossibili da adottare con le vecchie applicazioni, queste vengono raggruppate in una nuova sezione che contempla due livelli di implementazione.

## Processo di revisione

I lavori si sono protratti sin dal 2000, con un obiettivo per il completamento nel dicembre 2006. In data 11 giugno 2008, lo standard è stato approvato all'unanimità dal Comitato di revisione IEEE (RevCom), ed è stato formalmente approvato dalla IEEE-SA Standards Board il 12 giugno 2008. È stato pubblicato il 29 agosto 2008.

## Elenco delle modifiche

Il miglioramento più ovvio allo standard è l'aggiunta dello standard a 128 bit e quello decimale, e di alcune nuove operazioni; comunque sono state anche chiarite alcune definizioni chiave del lessico. Questo elenco evidenzia le maggiori differenze con lo standard per ogni sua sezione principale. Queste modifiche non sono state ancora approvate, quindi hanno ancora il valore di semplici proposte.

### Oggetto

L'oggetto di questo nuovo standard comprende numeri in virgola mobile anche in base decimale e a 128 bit.

### Definizioni

Molte definizioni sono state chiarite e puntualizzate. Alcuni termini sono stati sostituiti per chiarezza (es.: i numeri denormalizzati sono ora definiti subnormalizzati).

### Formati

Sono stati elencati i livelli di definizione dei numeri a virgola mobile, per evidenziare le differenze tra:

* l'insieme matematico dei numeri reali;
* gli elementi rappresentabili col formato in virgola mobile (un numero finito e limitato, che include -0, gli infiniti e i "Nan", not a number);
* le modalità di rappresentazione di questi enti (es.: segno-esponente-mantissa, ecc.);
* la sequenza di bit (codifica) usata.

L'insieme di enti rappresentabili è quindi esaminato in dettaglio, dimostrando che essi possono essere trattati sia considerando la mantissa una frazione sia considerandola un intero.

Al formato binario viene aggiunta la "quadrupla precisione" (128 bit).

Vengono descritti i nuovi formati decimali, della lunghezza dei formati binari: possono dare mantisse di 7, 16 o 34 cifre, e possono essere normalizzati o subnormalizzati. Per la massima portata e precisione, questo formato unisce parte dell'esponente e della mantissa in una zona di combinazione, e comprimono il resto della mantissa in un codice decimale molto denso.

### Arrotondamento

È stata aggiunta la modalità di arrotondamento "round-to-nearest, ties away from zero", necessaria solo per i numeri decimali.

### Operazioni

Questa sezione ospita numerose puntualizzazioni (soprattutto riguardo alle comparazioni tra numeri) e molte operazioni prima raccomandate (quiet copy, negate, abs, e copysign) sono ora necessarie.

Le nuove operazioni includono l'FMA (fused multiply-add), predicati di classificazione, varie funzioni di minimo e di massimo (che permettono un ordine totale) e due operazioni specifiche per i decimali (samequantum e quantize).

**Minimo e massimo (min e max)**

Queste due istruzioni sono definite in modo da essere commutative (eccetto che nel caso di input uguale a due Nan):

* min(+0,-0) = min(-0,+0) = -0
* max(+0,-0) = max(-0,+0) = +0

Per supportare operazioni in cui un Nan dovrebbe essere sostituito con un estremo, le operazioni di minimo e massimo sono definite in modo da restituire un numero x in preferenza ad un Nan:

* min(x,NaN) = min(Nan,x) = x
* max(x,NaN) = max(Nan,x) = x

In questo caso, le due operazioni vengono chiamate minnum e maxnum per evidenziare questa loro caratteristica.

**Aritmetica decimale**

In questa sezione è definita l'aritmetica decimale, compatibile con quella adottata in Java, C#, PL/I, COBOL, REXX, e altri.

**Conversione di base**

A differenza dell'754, il 754r richiederà una conversione tra base decimale e binaria secondo un determinato arrotondamento, all'interno della portata del formato.

### Sezioni 6-8

Il contenuto di queste sezioni è stato rivisto senza cambiamenti sostanziali; alcuni aspetti sono ancora in discussione.

## Estensioni non compatibili

Questa nuova sezione definisce un livello superiore di conformità allo standard, specificando estensioni ancora compatibili al precedente IEEE 754 ma che potrebbero dare problemi in vecchie applicazioni in certe circostanze. Finché non verrà nominata, verrà definita "sezione N".

Essa comprende:

* posizione estesa di arrotondamento
* la definizione del contenuto per i NaN e come essi debbano essere propagati
* la codifica binaria dei NaN
* operazioni estese sui NaN.
* restrizione della definizione di underflow

### Underflow

Nello standard 754 la definizione di underflow è che il risultato di un'operazione è tanto piccolo da causare una perdita di precisione. Per determinare se si fosse verificato un underflow o meno erano previste due condizioni: prima o dopo aver arrotondato il risultato a precisione infinita con esponente non limitato. Erano permesse due condizioni di perdita di precisione: risultato inesatto o perdita dovuta a denormalizzazione. Nessun sistema hardware noto implementa la seconda.

Al livello più alto di conformità del 754r si propone che soltanto la piccolezza dopo l'arrotondamento e l'imprecisione dovuta alla perdita di precisione siano cause di underflow.

## Annessi

Gli annessi hanno subito molti cambiamenti: per esempio il meccanismo di trapping è stato spostato in un annesso. Le trap non erano richieste dall'IEEE 754-1985, anche se molti presumevano che lo fossero. Nella revisione si cerca di concentrarsi maggiormente sulle funzioni che una data implementazione dovrebbe fornire per fare fronte a casi particolari: le trap sono una possibile soluzione, ma ne esistono altre.

* L'annesso "D" fornisce una guida agli sviluppatori di debugger per aiutarli a fornire funzioni desiderabili per chi deve effettuare il debugging di codice in virgola mobile..
* L'annesso "L" fornisce consigli agli sviluppatori di linguaggi su come collegare oggetti dello standard alle caratteristiche del loro linguaggio.
* L'annesso "Z" introduce tipi di dati opzionali per supportare altri formati in virgola mobile a larghezza fissa, nonché formati a precisione arbitraria (per esempio quando la precisione della rappresentazione e negli arrotondamenti è determinata a tempo di esecuzione) – sebbene tale materiale sia in corso di incorporazione nella specifica principale.

## Aree ancora in fase di elaborazione

* Regole di valutazione delle espressioni e modalità di scelta fra i diversi insiemi di regole.
* Ereditarietà e propagazione delle modalità (gestione delle eccezioni, presostituzione, arrotondamento) e dei flag (inesatto, underflow, overflow, divisione per zero, invalido). Si vorrebbe che le modalità possano essere ereditate da una routine chiamata, ma che non influenzino la chiamante; e che i flag invece si propaghino dalla chiamata alla chiamante.
* I NaN di segnalazione sono abbastanza usati perché si debba continuare a garantirne l'esistenza?
* Definizione di un formato di interscambio per l'IEEE 754r/Annesso Z.
