Half est un nombre binaire à virgule flottante qui occupe donc 16 bits (deux octets). Avec la moitié du nombre de bits en virgule flottante, Half peut représenter des valeurs dans la plage ±65504. Plus formellement, le type Half est défini comme un format d'échange 16 bits de base 2 destiné à prendre en charge l'échange de données en virgule flottante entre les implémentations. L'un des principaux cas d'utilisation du type Half est d'économiser de l'espace de stockage où le résultat calculé n'a pas besoin d'être stocké avec une précision totale. De nombreuses charges de travail de calcul profitent déjà du type Half : le machine learning, les cartes graphiques, les derniers processeurs, les bibliothèques SIMD natives, etc.
Les 16 bits du type Half sont divisés en:
- Bit de signe (bit dans une représentation de nombres signés qui indique le signe d’un nombre): 1 bit.
- Bits d'exposants: 5 bits.
- Bits significatifs: 10 bits (avec 1 bit implicite non stocké).
Malgré le fait que les bits significatifs comportent 10 bits, Prashanth Govindarajan de l'équipe .NET explique que la précision totale est en réalité de 11 bits. Le format est supposé avoir un bit de tête implicite de valeur 1 (sauf si le champ d'exposant est composé entièrement de zéros, auquel cas le bit de tête a la valeur 0). Pour représenter le nombre 1 au format Half, nous utiliserons les bits:
Envoyé par Half
Envoyé par Half
En général, les 16 bits d'une valeur Half sont interprétés comme -1 ^ (bit de signe) * 2 ^ (exposant stocké - 15) * (bit implicit + (bit significatif / 1024)). Un cas particulier existe pour l'exposant stocké 00000. Dans ce cas, les bits sont interprétés comme -1 ^ (bit de signe) * 2 ^ (- 14) * (0 + (bit significatif / 1024)). Examinons les représentations binaires de certains autres nombres au format Half:
Plus petite valeur positive non nulle
Envoyé par Half
Le plus grand nombre normal
Envoyé par Half
Envoyé par Half
Envoyé par Half
Envoyé par Half
Un Half peut être converti en / à partir d'un float / double en le lançant simplement:
Code : | Sélectionner tout |
float f = (float)half; Half h = (Half)floatValue;
L'un des points que Microsoft considère est la possibilité ou non d'ajouter la prise en charge de Half sur un langage comme C# à l'avenir. La prise en charge au niveau du langage permettrait un identifiant tel que f16 (similaire au f qui existe aujourd'hui) et des conversions implicites / explicites. Ainsi, le type Half défini par la bibliothèque doit être défini d'une manière qui n'entraîne aucun changement de rupture si Half venait à être implémenté. Plus précisément, l'éditeur estime devoir faire attention lors de l'ajout des opérateurs au type Half. Les conversions implicites en float / double pourraient conduire à des changements de rupture potentiels si la prise en charge du langage était ajoutée.
Source : Microsoft