Virgule fixe vs nombre à virgule flottante

109

Je ne peux tout simplement pas comprendre les nombres à virgule fixe et flottante en raison de définitions difficiles à lire à leur sujet partout sur Google. Mais aucun de ceux que j'ai lus ne fournit une explication assez simple de ce qu'ils sont vraiment. Puis-je obtenir une définition simple avec un exemple?

user942451
la source
J'ai également du mal à trouver une bonne définition. La chose principale que je recherche est quelque chose pour m'aider à comprendre ces résultats: 3.11 + 42.0 = 45.110001 (pas 45.11), 3.12 + 42.0 = 45.119999 (pas 45.12), 3.15 + 42.0 = 45.150002 (pas 45.15).
Bart S.
1
Je pense que c'est une discussion pertinente (décrivant en particulier les pièges avec des nombres flottants et la meilleure précision avec le point fixe et pourquoi vous ne voudriez jamais décrire l'argent comme un flottant. Stackoverflow.com/questions/6320209/…
Andrew Norman
Lien aléatoire où les sujets sont mentionnés "OpenGL® ES OpenGL ES comprend des profils pour les systèmes à virgule flottante et à virgule fixe et la spécification EGL ™ ..."
The Red Pea

Réponses:

145

Un nombre à virgule fixe a un nombre spécifique de bits (ou chiffres) réservés pour la partie entière (la partie à gauche de la virgule décimale) et un nombre spécifique de bits réservés pour la partie fractionnaire (la partie à droite de la virgule point). Peu importe la taille de votre nombre, il utilisera toujours le même nombre de bits pour chaque partie. Par exemple, si votre format de virgule fixe était en décimal, IIIII.FFFFFle plus grand nombre que vous pourriez représenter serait 99999.99999et le plus petit nombre différent de zéro serait 00000.00001. Chaque bit de code qui traite de tels nombres doit avoir une connaissance intégrée de l'emplacement de la virgule décimale.

Un nombre à virgule flottante ne réserve pas un nombre spécifique de bits pour la partie entière ou la partie fractionnaire. Au lieu de cela, il réserve un certain nombre de bits pour le nombre (appelé mantisse ou significande ) et un certain nombre de bits pour dire dans ce nombre se trouve la décimale (appelée exposant ). Ainsi, un nombre à virgule flottante qui a pris 10 chiffres avec 2 chiffres réservés pour l'exposant peut représenter une plus grande valeur de 9.9999999e+50et une plus petite valeur différente de zéro de 0.0000001e-49.

Gabe
la source
8
Eh bien, vous oubliez que les nombres à virgule flottante sont presque toujours signés, donc la valeur minimale serait vraiment -9.9999999e+50.
Brian Gordon
4
Il existe également un biais d'exposant afin que vous puissiez représenter beaucoup plus de valeurs discrètes entre 0 et 1 que vous ne pouvez entre 1 000 000 et 1 000 001. Et il y a beaucoup de complications avec les opérations en virgule flottante qui surviennent, comme s'assurer que vous ne déclarez pas 0 comme différence entre deux nombres très similaires lorsque le biais n'est pas suffisant pour augmenter la précision.
Brian Gordon
28
@BrianGordon: Je n'ai pas oublié les bits de signe; Je les ai volontairement ignorés pour avoir une description simple et ne pas avoir à me soucier de la différence entre minimum / maximum et plus petit / plus grand. J'ai aussi volontairement laissé de côté la polarisation des exposants (qui n'a rien à voir avec le nombre de valeurs discrètes entre deux nombres quelconques), NaNs, infinis, normalisation, dépassement progressif, zéros signés, le fait que la plupart des flottants sont binaires (ce qui permet le premier bit de la mantisse à omettre), et un certain nombre d'autres aspects qui ne sont pas nécessaires pour illustrer le concept.
Gabe
2
Pourquoi le seuil pour le nombre minimum de virgule fixe 00000.00001? Je m'attends à voir à la 00000.00000place. De plus, avez-vous des références plus détaillées sur les nombres à virgule fixe?
Nicholas Miller
4
@NickMiller: Désolé pour la confusion, mais je parlais de nombres non nuls. Mon exemple de format peut représenter 0, 0,00001, 0,00002, ..., 99999,99998, 99999,99999.
Gabe
31

Un nombre à virgule fixe signifie simplement qu'il y a un nombre fixe de chiffres après la virgule décimale. Un nombre à virgule flottante permet un nombre variable de chiffres après la virgule décimale.

Par exemple, si vous avez un moyen de stocker des nombres qui nécessite exactement quatre chiffres après la virgule décimale, alors il s'agit de virgule fixe. Sans cette restriction, c'est en virgule flottante.

Souvent, lorsque la virgule fixe est utilisée, le programmeur utilise en fait un entier et fait alors l'hypothèse que certains des chiffres sont au-delà de la virgule décimale. Par exemple, je pourrais vouloir garder deux chiffres de précision, donc une valeur de 100 signifie en fait 1,00, 101 signifie 1,01, 12345 signifie 123,45, etc.

Les nombres à virgule flottante sont plus généraux car ils peuvent représenter des nombres très petits ou très grands de la même manière, mais il y a une petite pénalité à devoir disposer d'un stockage supplémentaire pour l'emplacement de la décimale.

Vaughn Cato
la source
2
l'utilisation de la virgule flottante devient un problème lorsque vous commencez à faire des calculs avec eux, comme par exemple si vous ajoutez un très petit et un très grand nombre à virgule flottante ensemble. Le résultat additionné perd en précision car il doit représenter un nombre avec deux extrêmes et les décimales inférieures sont coupées (et ne sont pas arrondies).
Andrew Norman
2
l'utilisation potentielle de valeurs d'exposant en virgule flottante peut également causer des problèmes avec les systèmes informatiques qui attendent des nombres standard
Andrew Norman
5

D'après ce que je comprends, l'arithmétique à virgule fixe est effectuée à l'aide d'entiers. où la partie décimale est stockée dans une quantité fixe de bits, ou le nombre est multiplié par le nombre de chiffres de précision décimale nécessaires.

Par exemple, si le nombre 12.34doit être stocké et que nous n'avons besoin que de deux chiffres de précision après la virgule décimale, le nombre est multiplié par 100pour obtenir 1234. Lors de l'exécution de calculs sur ce nombre, nous utiliserions cet ensemble de règles. Ajouter 5620ou 56.20à ce nombre donnerait des 6854données ou 68.54.

Si nous voulons calculer la partie décimale d'un nombre à virgule fixe, nous utilisons l'opérande modulo (%).

12,34 (pseudocode):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

Les nombres à virgule flottante sont une histoire complètement différente dans la programmation. La norme actuelle pour les nombres à virgule flottante utilise quelque chose comme 23 bits pour les données du nombre, 8 bits pour l'exposant et 1 pour le signe. Voir ce lien Wikipedia pour plus d'informations à ce sujet.

M. Goober
la source
3

Le terme «virgule fixe» fait référence à la manière correspondante dans laquelle les nombres sont représentés, avec un nombre fixe de chiffres après, et parfois avant, la virgule décimale. Avec une représentation à virgule flottante, le placement de la virgule décimale peut «flotter» par rapport aux chiffres significatifs du nombre. Par exemple, une représentation en virgule fixe avec une convention de placement de virgule décimale uniforme peut représenter les nombres 123,45, 1234,56, 12345,67, etc., alors qu'une représentation en virgule flottante pourrait en plus représenter 1,234567, 123456,7, 0,00001234567, 1234567000000000, etc.

user3553000
la source
-6

Prenez le numéro 123.456789

  • En tant qu'entier, ce nombre serait 123
  • En tant que point fixe (2), ce nombre serait 123,46 (en supposant que vous l'avez arrondi)
  • En virgule flottante, ce nombre serait 123,456789

La virgule flottante vous permet de représenter la plupart des nombres avec une grande précision. Fixe est moins précis, mais plus simple pour l'ordinateur.

Sparky
la source
11
La précision avec laquelle vous pouvez écrire un nombre n'est pas liée au fait qu'il soit écrit en virgule flottante, entier ou en virgule fixe. Il est lié au nombre de chiffres significatifs dont vous disposez. Par exemple, INT_MAX est un nombre qui peut être représenté exactement comme un int, mais pas comme un flottant car ils n'ont pas les 31 bits de précision nécessaires pour le représenter exactement.
Kian
1
fixed est le plus précis tant qu'il est dimensionné pour gérer le nombre en question. Lorsque vous faites des calculs avec des nombres à virgule fixe, l'arrondi se produit lorsqu'un calcul a un reste dépassant la limite décimale. Avec une virgule flottante, vous pouvez obtenir une valeur très inexacte si vous ajoutez un très petit nombre avec un très grand. Lorsque cela se produit, les chiffres sont perdus sans arrondi
Andrew Norman
C'est trompeur et faux. La virgule fixe signifie que le nombre de chiffres après la virgule décimale est fixe. Cela ne dit rien sur sa précision.
Oscar Smith