Représentation à virgule flottante IEEE
Microsoft C++ (MSVC) est conforme aux normes numériques IEEE. La norme IEEE-754 décrit les formats à virgule flottante, un moyen de représenter des nombres réels dans le matériel. Il existe au moins cinq formats internes pour les nombres à virgule flottante qui sont représentés dans le matériel ciblé par le compilateur MSVC. Le compilateur n’utilise que deux d’entre eux. Les formats simple précision (4 octets) et double précision (8 octets) sont utilisés dans MSVC. La précision unique est déclarée à l’aide du mot clé float
. La double précision est déclarée à l’aide du mot clé double
. La norme IEEE spécifie également des formats de demi-précision (2 octets) et de quadrruplé (16 octets) et un format double précision (10 octets), que certains compilateurs C et C++ implémentent comme long double
type de données. Dans le compilateur MSVC, le long double
type de données est traité comme un type distinct, mais le type de stockage est mappé à double
. Toutefois, il existe une prise en charge intrinsèque et du langage d’assembly pour les calculs à l’aide des autres formats, y compris le format double précision étendu, où il est pris en charge par le matériel.
Les valeurs sont stockées comme suit :
Valeur | Stocké sous |
---|---|
simple précision | sign bit, exposant 8 bits, significificand 23 bits |
double précision | sign bit, exposant 11 bits, significificand 52 bits |
Dans les formats simple précision et double précision, il existe un début 1 supposé dans la partie fractionnaire. La partie fractionnaire est appelée significand (parfois appelée mantissa). Ce premier 1 n’est pas stocké en mémoire, donc les significands sont en fait 24 ou 53 bits, même si un bit moins est stocké. Le format double précision étendu stocke réellement ce bit.
Les exposants sont biaisés par la moitié de leur valeur possible. Cela signifie que vous soustrayez ce biais de l’exposant stocké pour obtenir l’exposant réel. Si l’exposant stocké est inférieur au biais, il s’agit en fait d’un exposant négatif.
Les exposants sont biaisés comme suit :
Exposant | Biaisé par |
---|---|
8 bits (simple précision) | 127 |
11 bits (double précision) | 1023 |
Ces exposants ne sont pas des pouvoirs de dix ; ils sont des pouvoirs de deux. Autrement dit, les exposants stockés 8 bits peuvent passer de -127 à 127, stockés sous forme de 0 à 254. La valeur 2127 équivaut approximativement à 1038, qui est la limite réelle de précision unique.
Le significand est stocké sous forme de fraction binaire de la forme 1.XXX... . Cette fraction a une valeur supérieure ou égale à 1 et inférieure à 2. Les nombres réels sont toujours stockés sous forme normalisée. Autrement dit, le significand est décalé à gauche, de sorte que le bit de haut ordre du significand est toujours 1. Étant donné que ce bit est toujours 1, il est supposé (non stocké) dans les formats simple précision et double précision. Le point binaire (et non décimal) est supposé être juste à droite du premier 1.
Le format de la représentation à virgule flottante est le suivant :
Format | octet 1 | octet 2 | octet 3 | octet 4 | ... | octet n |
---|---|---|---|---|---|---|
simple précision | SXXXXXXX |
XMMMMMMM |
MMMMMMMM |
MMMMMMMM |
||
double précision | SXXXXXXX |
XXXXMMMM |
MMMMMMMM |
MMMMMMMM |
... | MMMMMMMM |
S
représente le bit de signe, les X
's sont les bits exposants biaisés, et les M
's sont les bits significand. Le bit le plus à gauche est supposé dans les formats simple précision et double précision.
Pour déplacer correctement le point binaire, vous commencez par débiater l’exposant, puis déplacez le point binaire vers la droite ou la gauche du nombre approprié de bits.
Valeurs spéciales
Les formats à virgule flottante incluent certaines valeurs traitées spécialement.
Zero
Zéro ne peut pas être normalisé, ce qui le rend non représentatif sous la forme normalisée d’une valeur simple précision ou double précision. Un modèle de bits spécial de tous les zéros représente 0. Il est également possible de représenter -0 comme zéro avec le jeu de bits de signe, mais -0 et 0 comparent toujours comme égal.
Infinis
Les valeurs +∞ et −∞ sont représentées par un exposant de toutes les valeurs, et un signe qui est tous les zéros. Les valeurs positives et négatives sont représentées à l’aide du bit de signe.
Sous-normals
Il est possible de représenter des nombres de plus petites grandeurs que le plus petit nombre sous forme normalisée. Ils sont appelés nombres subnormals ou dénormals . Si l’exposant est tous les zéros et que le significand n’est pas zéro, le bit de début implicite du significand est considéré comme égal à zéro, pas un. La précision des nombres subnormals descend à mesure que le nombre de zéros de début dans l’significand monte.
NaN - Pas un nombre
Il est possible de représenter des valeurs qui ne sont pas des nombres réels, tels que 0 /0, au format à virgule flottante IEEE. Une valeur de ce type est appelée NaN. Un naN est représenté par un exposant de tous et d’un signe non nul. Il existe deux types de naNs, nans silencieux ou QNaNs, et de signalisation de réseaux nans ou de réseaux SNaN. Les naNs silencieux ont un point de tête dans l’élément significand et se propagent par le biais d’une expression. Ils représentent une valeur indéterminée, telle que le résultat de la division par l’infini ou la multiplication d’une infini par zéro. La signalisation des naNs a un zéro non significatif dans l’significand. Ils sont utilisés pour les opérations qui ne sont pas valides, pour signaler une exception matérielle à virgule flottante.
Exemples
Voici quelques exemples au format simple précision :
Pour la valeur 2, le bit de signe est égal à zéro. L’exposant stocké est 128 ou 1000 0000 en binaire, soit 127 plus 1. Le significand binaire stocké est (1.) 000 000 0000 0000 0000 0000 000, qui a un point de début implicite 1 et binaire, de sorte que le significand réel est un.
Valeur Formule Représentation binaire Valeur hexadécimale 2 1 * 21 0100 0000 0000 0000 0000 0000 0000 0000 0x40000000 Valeur -2. Identique à +2, sauf que le bit de signe est défini. La même chose est vraie pour le négatif de tous les nombres à virgule flottante au format IEEE.
Valeur Formule Représentation binaire Valeur hexadécimale -2 -1 * 21 1100 0000 0000 0000 0000 0000 0000 0000 0xC0000000 Valeur 4. Même significand, l’exposant augmente d’un (la valeur biaisée est 129, ou 100 000 1 en binaire.
Valeur Formule Représentation binaire Valeur hexadécimale 4 1 * 22 0100 0000 1000 0000 0000 0000 0000 0000 0x40800000 Valeur 6. Même exposant, significand est plus grand par moitié. C’est (1.) 100 0000 ... 0000 000 000, qui, dans la mesure où il s’agit d’une fraction binaire, est de 1 1/2, car les valeurs des chiffres fractionnaires sont 1/2, 1/4, 1/8, etc.
Valeur Formule Représentation binaire Valeur hexadécimale 6 1,5 * 22 0100 0000 1100 0000 0000 0000 0000 0000 0x40C00000 Valeur 1. Même significand que d’autres pouvoirs de deux, l’exposant biaisé est un inférieur à deux à 127, ou 011 111 1 en binaire.
Valeur Formule Représentation binaire Valeur hexadécimale 1 1 * 20 0011 1111 1000 0000 0000 0000 0000 0000 0x3F800000 Valeur 0,75. L’exposant biaisé est 126, 011 111 0 en binaire, et le significand est (1.) 100 0000 ... 0000 0000, soit 1 1/2.
Valeur Formule Représentation binaire Valeur hexadécimale 0.75 1,5 * 2-1 0011 1111 0100 0000 0000 0000 0000 0000 0x3F400000 Valeur 2.5. Exactement identique à deux sauf que le bit qui représente 1/4 est défini dans le significand.
Valeur Formule Représentation binaire Valeur hexadécimale 2.5 1,25 * 21 0100 0000 0010 0000 0000 0000 0000 0000 0x40200000 1/10 est une fraction répétée en binaire. Le significand est un peu inférieur à 1,6, et l’exposant biaisé dit que 1,6 doit être divisé par 16. (Il s’agit de 011 1101 1 en binaire, qui est 123 en décimal.) L’exposant vrai est 123 - 127 = -4, ce qui signifie que le facteur à multiplier est de 2 à 4 = 1/16. L’significat stocké est arrondi au dernier bit dans une tentative de représenter le nombre non représentatif aussi précisément que possible. (La raison pour laquelle 1/10 et 1/100 ne sont pas représentées exactement dans le fichier binaire est similaire à la raison pour laquelle 1/3 n’est pas représentée exactement en décimal.)
Valeur Formule Représentation binaire Valeur hexadécimale 0.1 1.6 * 2-4 0011 1101 1100 1100 1100 1100 1100 1101 0x3DCCCCCD Zéro est un cas spécial. Elle utilise la formule pour la valeur positive pouvant être représentée minimalement, qui est toutes les zéros.
Valeur Formule Représentation binaire Valeur hexadécimale 0 1 * 2-128 0000 0000 0000 0000 0000 0000 0000 0000 0x00000000
Voir aussi
Pourquoi les nombres à virgule flottante peuvent manquer de précision