Article de reference

Format à virgule flottante simple précision

Le format à virgule flottante simple précision (parfois appelé FP32 ou float32 ) est un format de nombre informatique , occupant généralement 32 bits dans la mémoire de l'ordina...

Le format à virgule flottante simple précision (parfois appelé FP32 ou float32 ) est un format de nombre informatique , occupant généralement 32 bits dans la mémoire de l'ordinateur ; il représente une large plage dynamique de valeurs numériques en utilisant un point de base flottant .

Une variable à virgule flottante peut représenter une plage de nombres plus large qu'une variable à virgule fixe de même largeur de bits, au détriment de la précision. Une variable entière signée de 32 bits a une valeur maximale de 2 31 − 1 = 2 147 483 647, tandis qu'une variable à virgule flottante IEEE 754 de base 2 de 32 bits a une valeur maximale de (2 − 2 −23 ) × 2 127 ≈ 3,4028235 × 10 38 . Tous les entiers comportant sept chiffres décimaux ou moins, et tout 2 n pour un nombre entier −149 ≤ n ≤ 127, peuvent être convertis exactement en une valeur à virgule flottante simple précision IEEE 754.

Dans la norme IEEE 754 , le format 32 bits en base 2 est officiellement appelé binary32 ; il était appelé single dans la norme IEEE 754-1985 . La norme IEEE 754 spécifie des types de virgule flottante supplémentaires, tels que les représentations en double précision 64 bits en base 2 et, plus récemment, les représentations en base 10.

L'un des premiers langages de programmation à proposer des types de données à virgule flottante en simple et double précision était Fortran . Avant l'adoption généralisée de la norme IEEE 754-1985, la représentation et les propriétés des types de données à virgule flottante dépendaient du fabricant et du modèle de l'ordinateur, ainsi que des décisions prises par les concepteurs du langage de programmation. Par exemple, le type de données à simple précision de GW-BASIC était le format à virgule flottante MBF 32 bits .

La précision simple est appelée REAL en Fortran ; SINGLE-FLOAT en Common Lisp ; float en C , C++ , C# et Java ; Float en Haskell et Swift ; et Single en Object Pascal ( Delphi ), Visual Basic et MATLAB . Cependant, float en Python , Ruby , PHP et OCaml et single dans les versions d' Octave antérieures à 3.2 font référence à des nombres à double précision . Dans la plupart des implémentations de PostScript et certains systèmes embarqués , la seule précision prise en charge est single.

Norme IEEE 754 : binary32

La norme IEEE 754 spécifie un binaire32 comme ayant :

Cela donne une précision de 6 à 9 chiffres décimaux significatifs . Si une chaîne décimale avec au plus 6 chiffres significatifs est convertie au format simple précision IEEE 754, donnant un nombre normal , puis reconvertie en chaîne décimale avec le même nombre de chiffres, le résultat final doit correspondre à la chaîne d'origine. Si un nombre simple précision IEEE 754 est converti en une chaîne décimale avec au moins 9 chiffres significatifs, puis reconverti en représentation simple précision, le résultat final doit correspondre au nombre d'origine.

Le bit de signe détermine le signe du nombre, qui est également le signe de la mantisse. Le champ d'exposant est un entier non signé de 8 bits compris entre 0 et 255, sous forme biaisée : une valeur de 127 représente l'exposant zéro réel. Les exposants vont de −126 à +127 (donc de 1 à 254 dans le champ d'exposant), car les valeurs d'exposant biaisées 0 (tous des 0) et 255 (tous des 1) sont réservées aux nombres spéciaux ( nombres sous-normaux , zéros signés , infinis et NaN ).

La mantisse vraie des nombres normaux comprend 23 bits de fraction à droite du point binaire et un bit de début implicite (à gauche du point binaire) avec la valeur 1. Les nombres sous-normaux et les zéros (qui sont les nombres à virgule flottante plus petits que le nombre normal positif le plus petit) sont représentés avec la valeur d'exposant biaisée 0, donnant au bit de début implicite la valeur 0. Ainsi, seuls 23 bits de fraction de la mantisse apparaissent dans le format de mémoire, mais la précision totale est de 24 bits (équivalent à log 10 (2 24 ) ≈ 7,225 chiffres décimaux).

Les éléments sont disposés comme suit :

La valeur réelle prise par une donnée binaire 32 bits donnée avec un signe donné , un exposant biaisé e (l'entier non signé 8 bits) et une fraction 23 bits est

,

qui donne

Dans cet exemple :

  • ,
  • ,
  • ,
  • ,
  • .

ainsi:

  • .

Note:

  • ,
  • ,
  • ,
  • .

Codage des exposants

L'exposant à virgule flottante binaire simple précision est codé à l'aide d'une représentation binaire décalée , le décalage nul étant de 127 ; également connu sous le nom de biais d'exposant dans la norme IEEE 754.

  • E min = 01 H −7F H = −126
  • E max = FE H −7F H = 127
  • Biais d'exposant = 7F H = 127

Ainsi, pour obtenir le véritable exposant tel que défini par la représentation binaire décalée, le décalage de 127 doit être soustrait de l'exposant stocké.

Les exposants stockés 00 H et FF H sont interprétés spécialement.

Exposant fraction = 0 fraction ≠ 0 Équation
00 H = 00000000 2 ±zéro nombre sous-normal
01 H , ..., EE H = 00000001 2 , ..., 11111110 2 valeur normale
FF H = 11111111 2 ± infini NaN (calme, signalisation)

La valeur normale positive minimale est et la valeur positive minimale (sous-normale) est .

Conversion décimale en binaire32

En général, reportez-vous à la norme IEEE 754 elle-même pour la conversion stricte (y compris le comportement d'arrondi) d'un nombre réel dans son format binaire32 équivalent.

Ici, nous pouvons montrer comment convertir un nombre réel en base 10 en un format binaire IEEE 754 en utilisant le schéma suivant :

  • Considérons un nombre réel avec une partie entière et une partie fractionnaire comme 12,375
  • Convertir et normaliser la partie entière en binaire
  • Convertissez la partie fractionnaire en utilisant la technique suivante comme indiqué ici
  • Ajoutez les deux résultats et ajustez-les pour produire une conversion finale appropriée

Conversion de la partie fractionnaire : Considérez 0,375, la partie fractionnaire de 12,375. Pour la convertir en fraction binaire, multipliez la fraction par 2, prenez la partie entière et répétez avec la nouvelle fraction par 2 jusqu'à ce qu'une fraction de zéro soit trouvée ou jusqu'à ce que la limite de précision soit atteinte, qui est de 23 chiffres de fraction pour le format IEEE 754 binary32.

, la partie entière représente le chiffre de la fraction binaire. Remultipliez 0,750 par 2 pour continuer
, fraction = 0,011, terminer

Nous voyons que peut être représenté exactement en binaire comme . Toutes les fractions décimales ne peuvent pas être représentées dans une fraction binaire à chiffres finis. Par exemple, le nombre décimal 0,1 ne peut pas être représenté exactement en binaire, seulement de manière approximative. Par conséquent :

Étant donné que le format IEEE 754 binary32 exige que les valeurs réelles soient représentées au format (voir Nombre normalisé , Nombre dénormalisé ), 1100.011 est décalé vers la droite de 3 chiffres pour devenir

Finalement, nous pouvons voir que :

D'où nous déduisons :

  • L'exposant est 3 (et sous la forme biaisée il est donc )
  • La fraction est 100011 (en regardant à droite du point binaire)

À partir de ceux-ci, nous pouvons former la représentation résultante au format binaire IEEE 754 32 bits de 12,375 :

Remarque : envisagez de convertir 68,123 au format IEEE 754 binary32 : en utilisant la procédure ci-dessus, vous vous attendez à obtenir avec les 4 derniers bits 1001. Cependant, en raison du comportement d'arrondi par défaut du format IEEE 754, vous obtenez , dont les 4 derniers bits sont 1010.

Exemple 1 : Considérons le nombre décimal 1. Nous pouvons voir que :

D'où nous déduisons :

  • L'exposant est 0 (et sous la forme biaisée, il est donc
  • La fraction est 0 (en regardant à droite du point binaire, 1,0 est tout )

À partir de ceux-ci, nous pouvons former la représentation résultante au format binaire IEEE 754 32 bits du nombre réel 1 :

Exemple 2 : Considérons une valeur de 0,25. Nous pouvons voir que :

D'où nous déduisons :

  • L'exposant est −2 (et sous la forme biaisée, il est )
  • La fraction est 0 (en regardant à droite du point binaire dans 1,0, il n'y a que des zéros)

À partir de ceux-ci, nous pouvons former la représentation résultante au format binaire IEEE 754 32 bits du nombre réel 0,25 :

Exemple 3 : Considérons une valeur de 0,375. Nous avons vu que

Ainsi, après avoir déterminé une représentation de 0,375, nous pouvons procéder comme ci-dessus :

  • L'exposant est −2 (et sous la forme biaisée, il est )
  • La fraction est 1 (en regardant à droite du point binaire dans 1,1 est un simple )

À partir de ceux-ci, nous pouvons former la représentation résultante au format IEEE 754 binary32 32 bits du nombre réel 0,375 :

Conversion de binaire32 en décimal

Si la valeur binary32, 41C80000 dans cet exemple, est en hexadécimal, nous la convertissons d'abord en binaire :

Ensuite, nous le décomposons en trois parties : le bit de signe, l'exposant et la mantisse.

  • Bit de signe :
  • Exposant:
  • Significande :

Nous ajoutons ensuite le 24ème bit implicite à la mantisse :

  • Significande :

et décodez la valeur de l'exposant en soustrayant 127 :

  • Exposant brut :
  • Exposant décodé :

Chacun des 24 bits de la mantisse (y compris le 24e bit implicite), du bit 23 au bit 0, représente une valeur, commençant à 1 et divisée par deux pour chaque bit, comme suit :

bit 23 = 1 bit 22 = 0,5 bit 21 = 0,25 bit 20 = 0,125 bit 19 = 0,0625 bit 18 = 0,03125 bit 17 = 0,015625 . . bit 6 = 0,00000762939453125 bit 5 = 0,000003814697265625 bit 4 = 0,0000019073486328125 bit 3 = 0,00000095367431640625 bit 2 = 0,000000476837158203125 bit 1 = 0,0000002384185791015625 bit 0 = 0,00000011920928955078125 

Le significande dans cet exemple a trois bits définis : bit 23, bit 22 et bit 19. Nous pouvons maintenant décoder le significande en additionnant les valeurs représentées par ces bits.

  • Significande décodée :

Ensuite, nous devons multiplier par la base, 2, à la puissance de l'exposant, pour obtenir le résultat final :

Ainsi

Ceci est équivalent à :

s est le bit de signe, x est l'exposant et m est la mantisse.

Limitations de précision sur les valeurs décimales (entre 1 et 16777216)

  • Décimales entre 1 et 2 : intervalle fixe 2 −23 (1+2 −23 est le prochain plus grand nombre flottant après 1)
  • Décimales entre 2 et 4 : intervalle fixe 2 −22
  • Décimales entre 4 et 8 : intervalle fixe 2 −21
  • ...
  • Décimales entre 2 n et 2 n+1 : intervalle fixe 2 n-23
  • ...
  • Décimales entre 2 22 = 4194304 et 2 23 = 8388608 : intervalle fixe 2 −1 = 0,5
  • Décimales entre 2 23 = 8388608 et 2 24 = 16777216 : intervalle fixe 2 0 = 1

Limitations de précision sur les valeurs entières

  • Les entiers compris entre 0 et 16777216 peuvent être représentés exactement (s'applique également aux entiers négatifs compris entre −16777216 et 0)
  • Les entiers compris entre 2 24 = 16777216 et 2 25 = 33554432 sont arrondis à un multiple de 2 (nombre pair)
  • Les entiers compris entre 2 25 et 2 26 sont arrondis à un multiple de 4
  • ...
  • Les entiers compris entre 2 n et 2 n+1 sont arrondis à un multiple de 2 n-23
  • ...
  • Les entiers compris entre 2 127 et 2 128 sont arrondis à un multiple de 2 104
  • Les entiers supérieurs ou égaux à 2 128 sont arrondis à « l'infini ».

Cas notables de précision simple

Ces exemples sont donnés en représentation binaire , en hexadécimal et en binaire , de la valeur à virgule flottante. Cela inclut le signe, l'exposant (biaisé) et la mantisse.

0 00000000 000000000000000000000001 2 = 0000 0001 16 = 2 −126 × 2 −23 = 2 −149 ≈ 1,4012984643 × 10 −45 (plus petit nombre subnormal positif) 
0 00000000 1111111111111111111111111 2 = 007f ffff 16 = 2 −126 × (1 − 2 −23 ) ≈ 1,1754942107 ×10 −38 (le plus grand nombre sous-normal) 
0 00000001 000000000000000000000000 2 = 0080 0000 16 = 2 −126 ≈ 1,1754943508 × 10 −38 (plus petit nombre normal positif) 
0 11111110 1111111111111111111111111 2 = 7f7f ffff 16 = 2 127 × (2 − 2 −23 ) ≈ 3,4028234664 × 10 38 (plus grand nombre normal) 
0 01111110 1111111111111111111111111 2 = 3f7f ffff 16 = 1 − 2 −24 ≈ 0,999999940395355225 (le plus grand nombre inférieur à un) 
0 01111111 0000000000000000000000000 2 = 3f80 0000 16 = 1 (un) 
0 01111111 000000000000000000000001 2 = 3f80 0001 16 = 1 + 2 −23 ≈ 1,00000011920928955 (plus petit nombre supérieur à un) 
1 10000000 0000000000000000000000000 2 = c000 0000 16 = −2 0 00000000 000000000000000000000000 2 = 0000 0000 16 = 0 1 00000000 000000000000000000000000 2 = 8000 0000 16 = −0 0 11111111 0000000000000000000000000 2 = 7f80 0000 16 = infini 1 11111111 0000000000000000000000000 2 = ff80 0000 16 = −infini 0 10000000 10010010000111111011011 2 = 4049 0fdb 16 ≈ 3,14159274101257324 ≈ π ( pi ) 0 01111101 01010101010101010101011 2 = 3eaa aaab 16 ≈ 0,333333343267440796 ≈ 1/3 x 11111111 1000000000000000000000001 2 = ffc0 0001 16 = qNaN (sur les processeurs x86 et ARM) x 11111111 0000000000000000000000001 2 = ff80 0001 16 = sNaN (sur les processeurs x86 et ARM) 

Par défaut, 1/3 arrondit vers le haut, au lieu de l'arrondir vers le bas comme en double précision , en raison du nombre pair de bits dans la mantisse. Les bits de 1/3 au-delà du point d'arrondi sont 1010...ceux qui sont supérieurs à 1/2 d'une unité à la dernière place .

Les codages de qNaN et sNaN ne sont pas spécifiés dans la norme IEEE 754 et sont implémentés différemment sur différents processeurs. Les processeurs de la famille x86 et de la famille ARM utilisent le bit le plus significatif du champ de significande pour indiquer un NaN silencieux . Les processeurs PA-RISC utilisent le bit pour indiquer un NaN de signalisation .

Optimisations

La conception du format à virgule flottante permet diverses optimisations, résultant de la génération facile d'une approximation du logarithme en base 2 à partir d'une vue entière du modèle de bits brut. L'arithmétique des nombres entiers et le décalage des bits peuvent donner une approximation de la racine carrée réciproque ( racine carrée inverse rapide ), couramment requise en infographie .

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index