Virgule fixe vs virgule flottante : plage, précision, matériel

En virgule fixe, la position de la virgule est fixée à l’avance et les nombres fractionnaires sont traités avec les mêmes suites de bits et les mêmes opérateurs que les entiers. Les circuits sont petits et consomment peu, d’où son usage dans les DSP, les microcontrôleurs sans unité de calcul flottant et les calculs entiers de l’inférence d’IA. La virgule flottante représente un nombre par un signe, un exposant et une mantisse, et déplace la virgule grâce à l’exposant : elle couvre ainsi une plage de valeurs très étendue avec une précision relative presque constante. Ses opérateurs sont plus grands, mais comme on n’a pas à se soucier de l’alignement des positions, elle est la norme pour le calcul général et l’entraînement d’IA.

CritèreVirgule fixeVirgule flottante
ReprésentationUne suite de bits entière lue avec une échelle fixée à l’avance (2 puissance −n). Notée par exemple Q15Trois champs, signe, exposant et mantisse : (−1)^signe × 1,mantisse × 2^(exposant − biais). Définie par la norme IEEE 754
Plage représentable (exemple)En Q15 (16 bits) : de −1 à 1 − 2⁻¹⁵En simple précision (32 bits) : environ 10⁻³⁸ à 10³⁸. Encore plus près de 0 avec les nombres dénormaux
PrécisionPas constant (erreur absolue constante). Plus la valeur est petite, plus l’erreur relative est grandePrécision relative presque constante (environ 7 chiffres en simple précision). Plus la valeur est grande, plus le pas est grand
OpérateursAdditionneurs et multiplieurs entiers tels quelsCircuits nécessaires pour comparer les exposants, aligner les mantisses, normaliser et arrondir
Taille des circuits et consommationFaibles. À largeur égale, bien moins qu’en virgule flottanteImportantes. Souvent plusieurs fois plus de surface et d’énergie qu’un opérateur entier de même largeur
Traitement du dépassementEn complément à deux, la valeur repart du côté opposé. On l’évite par une arithmétique saturante ou des accumulateurs dotés de bits supplémentaires (bits de garde)Au-delà de la plus grande valeur représentable, le résultat devient ±infini. 0 ÷ 0 et autres cas donnent NaN
Mise à l’échelleLe programmeur estime la plage des valeurs et conçoit les décalages et la position de la virgule à chaque opérationL’exposant s’ajuste automatiquement, on n’a presque pas à s’en soucier
Reproductibilité des résultatsLes résultats sont facilement identiques au bit prèsL’ordre des additions modifie légèrement le résultat (l’associativité n’est pas respectée)
Domaines d’utilisationDSP, petits microcontrôleurs sans unité flottante, traitement du signal sur FPGA et ASIC, calculs entiers de l’inférence d’IA (INT8, par exemple)Calcul général sur PC et serveurs, calcul scientifique (double précision), graphisme, entraînement d’IA (FP32, BF16, FP16, FP8)

Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.

Quand choisir l'un ou l'autre ?

Virgule fixe
Pour un traitement du signal dont la plage de valeurs est connue à l’avance, avec des circuits petits ou peu de puissance : filtres audio et de télécommunications, commande de moteurs, implémentation sur FPGA, inférence de modèles d’IA quantifiés.
Virgule flottante
Pour des calculs dont la plage de valeurs est large ou inconnue à l’avance : calcul scientifique, simulation physique, graphisme, entraînement d’IA, et plus généralement lorsque la facilité de développement et la stabilité numérique priment.
Ensemble
En IA, on entraîne de plus en plus souvent en virgule flottante, puis on quantifie pour l’inférence en entiers mis à l’échelle (INT8, par exemple), calculés avec des opérateurs entiers comme en virgule fixe.

Questions fréquentes

Pourquoi les circuits en virgule fixe sont-ils petits ?

La position de la virgule étant fixe, on peut utiliser tels quels des additionneurs et des multiplieurs entiers. En virgule flottante, chaque addition exige de comparer les exposants, d’aligner les mantisses, puis de normaliser et d’arrondir le résultat, ce qui augmente la surface et la consommation.

Que se passe-t-il en cas de dépassement en virgule fixe ?

Comme pour les entiers en complément à deux, au-delà du maximum la valeur repart du côté du minimum, ce qui produit une erreur importante, une grande valeur positive devenant par exemple négative. Les DSP l’évitent par une arithmétique saturante, qui bloque la valeur au maximum ou au minimum, ou par de larges accumulateurs dotés de bits de garde.

La virgule flottante est-elle exempte d’erreurs ?

Non. La virgule flottante utilise elle aussi un nombre fini de bits : les valeurs qui ne sont pas représentables exactement en binaire, comme 0,1, subissent des erreurs d’arrondi, et des pertes de chiffres significatifs lors des soustractions ou d’absorption lors des additions se produisent aussi. Son avantage est une plage étendue et une précision relative presque constante.

L’INT8 utilisé pour l’inférence d’IA est-il de la virgule fixe ?

Le principe est proche. Les valeurs flottantes sont divisées par une échelle et converties en entiers INT8, les multiplications-accumulations sont effectuées en entiers, puis le résultat est remultiplié par l’échelle à la fin. La différence avec la virgule fixe est que l’échelle n’est pas limitée aux puissances de 2 et peut être fixée par couche ou par canal.

Vérifier vos connaissances

Quelle est la principale raison pour laquelle les petits microcontrôleurs et DSP utilisent souvent l'arithmétique en virgule fixe plutôt qu'en virgule flottante ?

  1. ALe calcul se fait avec des circuits entiers, plus petits et moins gourmands en énergie
  2. BLa virgule fixe représente toujours une plage plus large que la virgule flottante
  3. CLa virgule fixe ne produit aucune erreur d'arrondi
Afficher la réponse et l'explication

Réponse : A. Le calcul se fait avec des circuits entiers, plus petits et moins gourmands en énergie

En virgule fixe, seule la position de la virgule est convenue et le contenu est un entier : additions et multiplications se font avec des circuits entiers. Les circuits d'alignement des exposants et de normalisation d'un opérateur flottant sont inutiles, ce qui réduit la surface de puce et la consommation ; elle est donc prisée dans les microcontrôleurs bon marché et les DSP de traitement du signal. En contrepartie, la plage représentable est étroite et la conception doit surveiller les débordements et le manque de précision. La plage est plus large en virgule flottante, et la virgule fixe produit aussi des erreurs d'arrondi.

Quelle combinaison du pas (résolution) et de la plage du format Q15 (virgule fixe signée sur 16 bits, 15 bits fractionnaires) est correcte ?

  1. APas 2⁻¹⁶, plage 0 à 1
  2. BPas 2⁻¹⁵, plage −1 à 1 − 2⁻¹⁵
  3. CPas 2⁻¹⁵, plage −32768 à 32767
Afficher la réponse et l'explication

Réponse : B. Pas 2⁻¹⁵, plage −1 à 1 − 2⁻¹⁵

En Q15, sur les 16 bits, 1 bit est le signe et 15 bits la partie fractionnaire ; la valeur est l'entier lu divisé par 2¹⁵ = 32768. La plage entière −32768 à 32767 divisée par 32768 donne −1 à 32767/32768 = 1 − 2⁻¹⁵, et le pas vaut 1/32768 = 2⁻¹⁵ ≈ 3,05 × 10⁻⁵. Il faut noter que +1 exactement n'est pas représentable. −32768 à 32767 est la plage obtenue en lisant la valeur comme un entier sans virgule. Ce format est courant en traitement du signal, notamment audio.

Lorsque deux nombres en virgule fixe à 8 bits fractionnaires sont multipliés par un multiplieur entier, comment le résultat doit-il être traité ?

  1. ALe résultat est déjà au format à 8 bits fractionnaires ; rien à faire
  2. BLe résultat a 4 bits fractionnaires ; il faut le décaler de 4 bits vers la gauche
  3. CLe résultat a 16 bits fractionnaires ; pour revenir au format d'origine, il faut le décaler de 8 bits vers la droite
Afficher la réponse et l'explication

Réponse : C. Le résultat a 16 bits fractionnaires ; pour revenir au format d'origine, il faut le décaler de 8 bits vers la droite

Un nombre à 8 bits fractionnaires est enregistré comme l'entier égal à sa valeur réelle multipliée par 2⁸. Le produit de deux tels nombres est multiplié par 2⁸ × 2⁸ = 2¹⁶ : il a 16 bits fractionnaires. Pour revenir au format à 8 bits fractionnaires, on divise par 2⁸, c'est-à-dire qu'on décale de 8 bits vers la droite, en arrondissant si nécessaire. Le produit ayant plus de chiffres, les calculs intermédiaires se font normalement sur une largeur plus grande. Pour une addition, le nombre de bits fractionnaires est inchangé ; pour une multiplication, ils s'additionnent.

  1. En simple précision IEEE 754 (32 bits), quelle combinaison donne le nombre de bits attribués au signe, à l'exposant et à la mantisse ?
  2. Quelle est la principale raison de l'emploi de bfloat16 pour l'entraînement en IA ?
  3. En inférence d'IA, quel est le principal avantage de la conversion (quantification) des poids de FP32 en INT8 ?

Questions d'entraînement sur Arithmétique des ordinateurs

Termes clés expliqués

Virgule fixe
Représentation des nombres fractionnaires avec une position de virgule fixée, sur la même suite de bits qu'un entier. Calculable avec des circuits arithmétiques entiers, compacts et peu gourmands, mais la plage représentable est étroite. On la note parfois par le nombre de bits fractionnaires, comme Q15.
IEEE 754
Norme internationale définissant la représentation des nombres à virgule flottante et les règles de calcul. Elle définit les formats simple précision (32 bits), double précision (64 bits), etc., les modes d'arrondi et les valeurs spéciales comme l'infini et NaN, afin que les résultats soient identiques d'un ordinateur à l'autre.
Arithmétique saturée
Opération qui, lorsque le résultat dépasse la plage représentable, le bloque à la valeur maximale ou minimale au lieu de le laisser reboucler par débordement. Utilisée en traitement du signal audio et image pour éviter de grosses erreurs.
bfloat16
Format à virgule flottante sur 16 bits : 1 bit de signe, 8 bits d'exposant, 7 bits de mantisse. Son exposant étant identique à celui du FP32, sa plage est large ; malgré sa faible précision, il est utilisé pour l'entraînement d'IA. Le FP16 (exposant 5 bits, mantisse 10 bits) est plus précis mais de plage plus étroite.
INT8
Entier signé sur 8 bits (−128 à 127). En inférence d'IA, convertir poids et activations en INT8 avec un facteur d'échelle (quantification) réduit fortement les calculs et la mémoire, et permet un traitement rapide avec de petits circuits entiers.

Comparatifs associés