floating-pointMise en route avec virgule flottante


Remarques

Cette section fournit une vue d'ensemble de ce qu'est un point flottant et pourquoi un développeur peut vouloir l'utiliser.

Il convient également de mentionner tous les grands sujets en virgule flottante et d'établir un lien avec les sujets connexes. Comme la documentation à virgule flottante est nouvelle, vous devrez peut-être créer des versions initiales de ces rubriques connexes.

Vue d'ensemble

Qu'est-ce qu'un point flottant?

Il existe deux types de nombres:

  • point fixe où un certain nombre de chiffres sont disponibles avant et après le point de base.
  • virgule flottante où un certain nombre de chiffres sont disponibles pour la mantisse et pour l'exposant.

Un exemple utilisant des chiffres décimaux avec trois décimales avant la virgule et deux décimales après la décimale:

  • 0 serait représenté par 000.00
  • 0.123 serait représenté par 000.12
  • 0.00123 serait représenté par 000.00
  • 1 serait représenté comme 001.00
  • 1.123 serait représenté par 001.12
  • 1.00123 serait représenté par 001.00
  • 123.456 serait représenté par 123.45
  • 1234.56 est une erreur car il serait stocké en 234.56 et c'est tout simplement faux

Un exemple utilisant des chiffres décimaux avec cinq décimales pour la mantisse et une décimale pour l'exposant:

  • 0 pourrait être représenté par .00000 x 10 ^ 0
  • 0.1 pourrait être représenté par .10000 x 10 ^ 0
  • 0.0000123456 pourrait être représenté par .12345 x 10 ^ -4
  • 0.000000000123456 pourrait être représenté par .12345 x 10 ^ -9
  • 0.00000000001 est une erreur car l'exposant n'est pas assez grand pour stocker le nombre
  • 1 pourrait être représenté comme .10000 x 10 ^ 1
  • 1.123 pourrait être représenté par .11230 x 10 ^ 1
  • 1.00123 pourrait être représenté par .10012 x 10 ^ 1
  • 123.45678 pourrait être représenté par .12345 x 10 ^ 2
  • 123456789.1 pourrait être représenté par .12345 x 10 ^ 9
  • 1000000000 est une erreur car l'exposant n'est pas assez grand pour stocker le nombre

Ainsi, un nombre à virgule flottante peut représenter des nombres de magnitudes très différentes (0.000000000123456 et 123456789.1) avec la même précision relative.

Les nombres à virgule fixe sont utiles lorsqu'un nombre particulier de décimales est toujours nécessaire, quelle que soit l'ampleur du nombre (argent par exemple). Les nombres à virgule flottante sont utiles lorsque la magnitude varie et que la précision est toujours nécessaire. Par exemple: pour un ingénieur routier, les distances sont mesurées en mètres et 0,01 de mètre est insignifiant, mais pour un concepteur de micropuces, la différence entre 0,0000001 mètres et 0,00000001 mètres est énorme - et un physicien peut avoir besoin de chiffres minuscules dans le même calcul. La précision à différentes grandeurs est ce qui rend les nombres à virgule flottante utiles.

Comment ça marche

Les ordinateurs n'utilisent pas de décimal - ils utilisent des nombres binaires et cela pose des problèmes pour les virgules flottantes car tous les nombres décimaux ne peuvent pas être représentés exactement par un nombre à virgule flottante et cela introduit des erreurs d'arrondi dans les calculs.

Ayant fait tous les exemples en décimal, il est important de noter que parce qu'ils sont binaires, au lieu de stocker un nombre à virgule flottante en tant que somme de fractions décimales:

123.875 = 1/10^-2 + 2/10^-1 + 3/10^0 + 8/10^1 + 7/10^2 + 5/10^3
 

les ordinateurs stockent des nombres à virgule flottante sous la forme d'une somme de fractions binaires:

123.875 = 1/2^-6 + 1/2^-5 + 1/2^-4 + 1/2^-3 + 1/2^-1 + 1/2^0 + 1/2^1 + 1/2^2 + 1/2^3
 

Il existe de nombreuses manières différentes de stocker des patrons de bits représentant ces fractions, mais la plupart des ordinateurs utilisent maintenant la norme IEEE-754. Il contient des règles pour stocker à la fois les représentations décimales et binaires et pour différents types de données de taille.

La façon dont les numéros normaux sont stockés en utilisant la norme IEEE est la suivante:

  • un bit pour le signe - stocké dans le MSB, 1 signifie négatif et 0 signifie positif
  • quelques bits pour l'exposant - le biais est soustrait pour obtenir à la fois des exposants positifs et négatifs
  • quelques bits pour la mantisse - chiffres après la décimale avec un 1 implicite avant la décimale.

Pour permettre un débordement plus progressif, les nombres dénormalisés (lorsque les bits d'exposant sont tous égaux à zéro) sont traités spécialement: l'exposant est défini sur -126 et le premier implicite avant la décimale n'est PAS ajouté à la mantisse.

Nombres de virgule flottante IEEE-754 32 bits

Pour un nombre à virgule flottante IEEE-754 normal de 32 bits:

  • le bit 32 est le signe
  • les bits 24 à 31 sont l'exposant - le biais est de 127
  • les bits 1 à 23 sont la mantisse

Donc, un nombre normal est calculé comme suit:

-1^sign * 2^(exponent-bias) * 1.mantissa
 

Si le modèle de bit était:

0 10000101 11101111100000000000000
 

La valeur est alors:

-1^0 * 2^(133-127) * 1.111011111
-1^0 *     2^6     * (1 + 1/2 + 1/4 + 1/8 + 1/32 + 1/64 + 1/128 + 1/256 + 1/512)
   1 *      64     * 991/512
         123.875
 

Il y a des valeurs spéciales:

0 11111111 11111111111111111111111 = NaN
0 11111111 00000000000000000000000 = +infinity
1 11111111 00000000000000000000000 = -infinity
0 00000000 00000000000000000000000 = +Zero
1 00000000 00000000000000000000000 = -Zero
 

Les spécificités du format 32 bits IEEE-754 sont disponibles à l'adresse suivante: