# Format virgule flottante demi-précision

En informatique, le format demi-précision (appelé parfois FP16 ou float16) est un format de nombre (en) binaire en virgule flottante qui occupe 16 bits (deux octets sur les ordinateurs modernes) en mémoire de l'ordinateur. Elle est conçue pour le stockage de valeurs en virgule flottante dans des applications où une précision supérieure n'est pas essentielle, en particulier dans le traitement d'images et les réseaux de neurones.
Presque toutes les utilisations modernes suivent la norme IEEE 754-2008, où le format en base 2 sur 16 bits est appelé binary16, et l'exposant utilise 5 bits. Elle peut représenter des valeurs sur la plage ± 65504, la plus petite valeur supérieure à 1 étant 1 + 1/1024.
En fonction de l'ordinateur, la demi-précision peut être plus rapide d'au moins un ordre de grandeur que la double précision, par exemple 550 PFLOPS pour la demi-précision contre 37 PFLOPS pour la double précision sur un serveur du cloud.

## Historique

Plusieurs formats en virgule flottante 16 bits ont existé dont celui du DSP HD61810 d'Hitachi en 1982 (un exposant de 4 bits et une mantisse de 12 bits), le WIF de Thomas J. Scott en 1991 (5 bits d'exposant, 10 bits de mantisse) et le processeur graphique Voodoo de 3dfx de 1995 (identique à Hitachi).
ILM recherchait un format d'image qui pourrait accepter une large gamme dynamique, mais sans la lourdeur et le coût mémoire du format à virgule flottante simple ou double précision. Le groupe shading programmable accéléré par hardware dirigé par John Airey à SGI (Silicon Graphics) inventa le type de données s10e5 en 1997 dans le cadre du travail de conception 'bali'. Ceci est décrit dans un article présenté à SIGGRAPH 2000 (voir section 4.3) et documenté plus à fond dans le brevet US 7518615. Il a été popularisé pour son usage dans le format d'image open-source OpenEXR.
Nvidia et Microsoft ont défini le type half (demi) dans le langage Cg, publié début 2002, et implémenté dans le silicium dans la carte graphique GeForce FX, sortie fin 2002. Depuis lors, le support des nombres à virgule flottante 16 bits est devenu très courant sur les cartes graphiques.
L'extension F16C (en) sortie en 2012 permet aux processeurs x86 de convertir des flottants demi-précision en flottants simple précision et vice-versa en une instruction machine.

## Format virgule flottante binaire demi-précision de l'IEEE 754 : binary16

La norme IEEE 754 spécifie un binary16 comme ayant le format suivant :
* Bit de signe : 1 bit
* Largeur de l'exposant : 5 bits
* Précision de la mantisse : 11 bits (10 explicitement stockés)
Le format est organisé comme suit :
Dans ce format, la mantisse est réputé avoir un bit de poids fort implicite de valeur 1, sauf si le champ de l'exposant ne contient que des zéros. Par conséquent, seuls 10 bits de la mantisse apparaissent dans le format mémoire mais la précision totale est de 11 bits. En termes IEEE 754, la mantisse fait 10 bits, mais la précision de la mantisse est de 11 bits (log$_{10}$(2$^{11}$) ≈ 3,311 chiffres décimaux, soit 4 chiffres ± légèrement moins que 5 unité de plus faible précision (en).

### Codage de l'exposant

L'exposant du nombre format binaire en virgule flottante demi-précision est codé avec une représentation binaire décalée, le décalage du zéro étant de 15 ; appelée également exposant biaisé dans la norme IEEE 754.
* E$_{min}$ = 00001$_2$ − 01111$_2$ = −14
* E$_{max}$ = 11110$_2$ − 01111$_2$ = 15
* Exposant biaisé = 01111$_2$ = 15
Par conséquent, comme défini par la représentation binaire biaisée, afin d'obtenir le vrai exposant le biais de 15 doit être soustrait de l'exposant stocké.
Les exposants stockés 00000$_2$ et 11111$_2$ sont interprétés spécialement.
| Exposant | Mantisse = zéro | Mantisse ≠ zéro | Équation |
| 00000$_2$ | zéro, −0 | nombres dénormalisés | (−1)$^{bitsdesigne}$ × 2$^{−14}$ × 0.bits de la mantisse$_2$ |
| 00001$_2$, ..., 11110$_2$ | valeur normalisée | valeur normalisée | (−1)$^{bitsdesigne}$ × 2$^{exposant−15}$ × 1.bits de la mantisse$_2$ |
| 11111$_2$ | ± infini | NaN (silencieux, avertisseur) | |
La plus petite valeur strictement positive (dénormalisée) est 2$^{−24}$ ≈ 5.96 × 10$^{−8}$. La plus petite valeur positive normalisée est 2$^{−14}$ ≈ 6.10 × 10$^{−5}$. La plus grande valeur représentable est (2−2$^{−10}$) × 2$^{15}$ = 65504.

### Exemples de nombres demi-précision

Ces exemples sont donnés en représentation binaire de la valeur en virgule flottante. Elle comprend le bit de signe, l'exposant (biaisé) et la mantisse.
| Binaire | Hex | Valeur | Notes |
| 0 00000 0000000000 | 0000 | 0 |
| 0 00000 0000000001 | 0001 | 2$^{−14}$ × (0 + 1/1024 ) ≈ 0.000000059604645 | plus petit nombre positif dénormalisé |
| 0 00000 1111111111 | 03ff | 2$^{−14}$ × (0 + 1023/1024 ) ≈ 0.000060975552 | plus grand nombre dénormalisé |
| 0 00001 0000000000 | 0400 | 2$^{−14}$ × (1 + 0/1024 ) ≈ 0.00006103515625 | plus petit nombre positif normalisé |
| 0 01101 0101010101 | 3555 | 2$^{−2}$ × (1 + 341/1024 ) ≈ 0.33325195 | valeur la plus proche de 1/3 |
| 0 01110 1111111111 | 3bff | 2$^{−1}$ × (1 + 1023/1024 ) ≈ 0.99951172 | plus grand nombre inférieur à un |
| 0 01111 0000000000 | 3c00 | 2$^0$ × (1 + 0/1024 ) = 1 | un |
| 0 01111 0000000001 | 3c01 | 2$^0$ × (1 + 1/1024 ) ≈ 1.00097656 | plus petit nombre supérieur à un |
| 0 11110 1111111111 | 7bff | 2$^{15}$ × (1 + 1023/1024 ) = 65504 | plus grand nombre normal |
| 0 11111 0000000000 | 7c00 | ∞ | infini |
| 1 00000 0000000000 | 8000 | −0 |
| 1 10000 0000000000 | c000 | −2 |
| 1 11111 0000000000 | fc00 | −∞ | infini négatif |
Par défaut, 1/3 est arrondi en valeur inférieure comme en double précision, à cause du nombre impair de bits dans la mantisse. Les bits au-delà du point d'arrondi sont 0101... ce qui inférieur à 1/2 unité de plus faible précision (en).