Quelle est la différence entre une opération à virgule flottante simple précision et double précision?

169

Quelle est la différence entre une opération à virgule flottante simple précision et une opération flottante double précision?

Je suis particulièrement intéressé par les termes pratiques liés aux consoles de jeux vidéo. Par exemple, la Nintendo 64 a-t-elle un processeur 64 bits et si c'est le cas, cela signifierait-il qu'elle était capable d'opérations en virgule flottante à double précision? La PS3 et la Xbox 360 peuvent-elles effectuer des opérations en virgule flottante en double précision ou en simple précision et, en général, les capacités de double précision sont-elles utilisées (si elles existent?).

tweetypi
la source
17
Le fait que le processeur soit 64 bits signifie généralement que le processeur a des registres à usage général de 64 bits (c'est-à-dire des nombres entiers) et une taille d'adresse mémoire . Mais cela ne dit rien sur les mathématiques en virgule flottante. Par exemple, les processeurs Intel IA-32 sont 32 bits, mais ils prennent en charge nativement les flotteurs à double précision.
Roman Zavalov

Réponses:

215

Remarque: la Nintendo 64 dispose d'un processeur 64 bits, cependant:

De nombreux jeux ont profité du mode de traitement 32 bits de la puce car la plus grande précision des données disponible avec les types de données 64 bits n'est généralement pas requise par les jeux 3D, ainsi que le fait que le traitement des données 64 bits utilise deux fois plus de RAM, de cache et la bande passante, réduisant ainsi les performances globales du système.

De Webopedia :

Le terme double précision est quelque peu inapproprié car la précision n'est pas vraiment double.
Le mot double dérive du fait qu'un nombre à double précision utilise deux fois plus de bits qu'un nombre à virgule flottante ordinaire.
Par exemple, si un nombre simple précision nécessite 32 bits, son homologue double précision aura une longueur de 64 bits.

Les bits supplémentaires augmentent non seulement la précision mais également la plage de grandeurs qui peuvent être représentées.
La quantité exacte d'augmentation de la précision et de la plage de magnitudes dépend du format utilisé par le programme pour représenter les valeurs à virgule flottante.
La plupart des ordinateurs utilisent un format standard connu sous le nom de format à virgule flottante IEEE.

Le format IEEE double précision a en fait plus de deux fois plus de bits de précision que le format simple précision, ainsi qu'une plage beaucoup plus grande.

De la norme IEEE pour l'arithmétique à virgule flottante

Précision unique

La représentation standard à virgule flottante simple précision IEEE nécessite un mot de 32 bits, qui peut être représenté comme numéroté de 0 à 31, de gauche à droite.

  • Le premier bit est le signe bit de , S,
  • les huit bits suivants sont les bits d' exposant , 'E' et
  • les 23 derniers bits sont la fraction 'F':

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

La valeur V représentée par le mot peut être déterminée comme suit:

  • Si E = 255 et F est différent de zéro, alors V = NaN ("Pas un nombre")
  • Si E = 255 et F est zéro et S est 1, alors V = -Infinity
  • Si E = 255 et F est zéro et S est 0, alors V = Infini
  • Si 0<E<255alors V=(-1)**S * 2 ** (E-127) * (1.F)où "1.F" est destiné à représenter le nombre binaire créé en préfixant F avec un 1 implicite et un point binaire.
  • Si E = 0 et F est différent de zéro, alors V=(-1)**S * 2 ** (-126) * (0.F). Ce sont des valeurs «non normalisées».
  • Si E = 0 et F est zéro et S est 1, alors V = -0
  • Si E = 0 et F est zéro et S est 0, alors V = 0

En particulier,

0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0

0 11111111 00000000000000000000000 = Infinity
1 11111111 00000000000000000000000 = -Infinity

0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN

0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5

0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126)
0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127) 
0 00000000 00000000000000000000001 = +1 * 2**(-126) * 
                                     0.00000000000000000000001 = 
                                     2**(-149)  (Smallest positive value)

Double precision

La représentation standard à virgule flottante double précision IEEE nécessite un mot de 64 bits, qui peut être représenté comme numéroté de 0 à 63, de gauche à droite.

  • Le premier bit est le bit de signe , S,
  • les onze bits suivants sont les bits d' exposant , 'E' et
  • les 52 derniers bits sont la fraction 'F':

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

La valeur V représentée par le mot peut être déterminée comme suit:

  • Si E = 2047 et F est différent de zéro, alors V = NaN ("Pas un nombre")
  • Si E = 2047 et F est zéro et S est 1, alors V = -Infinity
  • Si E = 2047 et F est zéro et S est 0, alors V = Infinity
  • Si 0<E<2047alors V=(-1)**S * 2 ** (E-1023) * (1.F)où "1.F" est destiné à représenter le nombre binaire créé en préfixant F avec un 1 implicite et un point binaire.
  • Si E = 0 et F est différent de zéro, alors V=(-1)**S * 2 ** (-1022) * (0.F) ce sont des valeurs "non normalisées".
  • Si E = 0 et F est zéro et S est 1, alors V = -0
  • Si E = 0 et F est zéro et S est 0, alors V = 0

Référence:
Norme ANSI / IEEE 754-1985,
Norme pour l'arithmétique binaire à virgule flottante.

VonC
la source
9
Je sais que cela de votre source, mais je n'aime pas la phrase: "Le terme double précision est quelque chose d'un abus de langage parce que la précision n'est pas vraiment double." La simple et la double précision de nos jours sont définies de manière assez universelle par l'IEEE, et comme vous le faites remarquer, la simple précision a 23 bits dans la fraction et le double a 52 bits - c'est fondamentalement le double de la précision ...
Carl Walsh
5
@ZeroDivide ' **' est Exponentiation
VonC
11
@CarlWalsh 52/23! = 2 ergo ce n'est pas "le double de la précision"
rfoo
@johnson Vous avez plus de détails sur les valeurs non normalisées dans easy68k.com/paulrsm/6502/WOZFPPAK.TXT , ainsi que dans stackoverflow.com/a/28801033/6309
VonC
2
@rfoo Si vous voulez être pédant, bien sûr, ce n'est pas exactement le double, mais 52/2> 23 donc oui, c'est le double de la précision, c'est juste le double et plus encore.
JShorthouse
42

J'ai lu beaucoup de réponses mais aucune ne semble expliquer correctement d'où vient le mot double . Je me souviens d'une très bonne explication donnée par un professeur d'université que j'avais il y a quelques années.

Rappelant le style de la réponse de VonC, un représentation à virgule flottante simple précision utilise un mot de 32 bits.

  • 1 bit pour le signe , S
  • 8 bits pour le exposant , 'E'
  • 24 bits pour la fraction , également appelée mantisse , ou coefficient (même si seulement 23 sont représentés). Appelons-le «M» (pour la mantisse , je préfère ce nom car «fraction» peut être mal compris).

Représentation:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(Juste pour souligner, le bit de signe est le dernier, pas le premier.)

Une représentation à virgule flottante double précision utilise un mot de 64 bits.

  • 1 bit pour le signe , S
  • 11 bits pour l' exposant , 'E'
  • 53 bits pour la fraction / mantisse / coefficient (même si seulement 52 sont représentés), 'M'

Représentation:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

Comme vous le remarquerez peut-être, j'ai écrit que la mantisse a, dans les deux types, un peu plus d'informations par rapport à sa représentation. En fait, la mantisse est un nombre représenté sans tout son non significatif 0. Par exemple,

  • 0,000124 devient 0,124 × 10 −3
  • 237,141 devient 0,237141 × 10 3

Cela signifie que la mantisse sera toujours sous la forme

0.α 1 α 2 ... α t × β p

où β est la base de la représentation. Mais comme la fraction est un nombre binaire, α 1 sera toujours égal à 1, donc la fraction peut être réécrite comme 1.α 2 α 3 ... α t + 1 × 2 p et le 1 initial peut être implicitement supposé, faire de la place pour un bit supplémentaire (α t + 1 ).

Maintenant, il est évidemment vrai que le double de 32 est 64, mais ce n'est pas de là que vient le mot.

La précision indique le nombre de chiffres décimaux corrects , c'est-à-dire sans aucune sorte d'erreur de représentation ou d'approximation. En d'autres termes, il indique le nombre de chiffres décimaux pouvant être utilisés en toute sécurité .

Cela dit, il est facile d'estimer le nombre de chiffres décimaux pouvant être utilisés en toute sécurité:

  • précision simple : log 10 (2 24 ), soit environ 7 ~ 8 chiffres décimaux
  • double précision : log 10 (2 53 ), soit environ 15 ~ 16 chiffres décimaux
Alessandro
la source
19

D'accord, la différence fondamentale au niveau de la machine est que la double précision utilise deux fois plus de bits qu'une simple. Dans l'implémentation habituelle, c'est 32 bits pour simple, 64 bits pour double.

Mais qu'est-ce que ça veut dire ? Si nous supposons la norme IEEE, alors un nombre de précision unique a environ 23 bits de la mantisse, et un exposant maximum d'environ 38; une double précision a 52 bits pour la mantisse, et un exposant maximum d'environ 308.

Les détails sont sur Wikipedia , comme d'habitude.

Charlie Martin
la source
11

Pour ajouter à toutes les merveilleuses réponses ici

Tout d'abord, float et double sont tous deux utilisés pour la représentation des nombres fractionnaires. Ainsi, la différence entre les deux provient du fait avec quelle précision ils peuvent stocker les nombres.

Par exemple: je dois stocker 123.456789. L'un peut ne stocker que 123.4567 tandis que d'autres peuvent stocker l'exact 123.456789.

Donc, fondamentalement, nous voulons savoir à quel point le nombre peut être stocké avec précision et c'est ce que nous appelons la précision.

Citant @Alessandro ici

La précision indique le nombre de chiffres décimaux corrects , c'est-à-dire sans aucune sorte d'erreur de représentation ou d'approximation. En d'autres termes, il indique le nombre de chiffres décimaux pouvant être utilisés en toute sécurité .

Float peut stocker avec précision environ 7 à 8 chiffres dans la partie fractionnaire tandis que Double peut stocker avec précision environ 15 à 16 chiffres dans la partie fractionnaire

Ainsi, float peut stocker le double de la quantité de partie fractionnaire. C'est pourquoi Double s'appelle le double du flotteur

Gars simple
la source
7

Quant à la question "La ps3 et la xbxo 360 peuvent-elles effectuer des opérations en virgule flottante en double précision ou seulement en simple précision et en général, les capacités de double précision sont-elles utilisées (si elles existent?)."

Je crois que les deux plates-formes sont incapables de doubler la virgule flottante. Le processeur Cell d'origine n'avait que des flotteurs de 32 bits, de même que le matériel ATI sur lequel la XBox 360 est basée (R600). La Cellule a plus tard pris en charge le double virgule flottante, mais je suis presque sûr que la PS3 n'utilise pas cette puce.

codekaizen
la source
5

Fondamentalement, l' arithmétique à virgule flottante à simple précision traite des nombres à virgule flottante de 32 bits alors que la double précision traite de 64 bits.

Le nombre de bits en double précision augmente la valeur maximale qui peut être stockée ainsi que la précision (c'est-à-dire le nombre de chiffres significatifs).

cletus
la source
5

Tous ont expliqué en détail et je ne pourrais rien ajouter de plus. Bien que je voudrais l'expliquer en termes profanes ou en anglais simple

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999

.....

Une variable, capable de stocker ou de représenter «1,9» fournit moins de précision que celle capable de contenir ou de représenter 1,9999. Ces fractions peuvent représenter une énorme différence dans les gros calculs.

Asad
la source
2

La double précision signifie que les nombres prennent deux fois la longueur du mot à stocker. Sur un processeur 32 bits, les mots sont tous 32 bits, donc les doubles sont 64 bits. En termes de performances, cela signifie que les opérations sur les nombres à double précision prennent un peu plus de temps à s'exécuter. Vous obtenez donc une meilleure autonomie, mais les performances sont minimes. Ce coup est un peu atténué par les unités matérielles à virgule flottante, mais il est toujours là.

Le N64 utilisait un NEC VR4300 basé sur MIPS R4300i qui est un processeur 64 bits, mais le processeur communique avec le reste du système sur un bus de 32 bits de large. Ainsi, la plupart des développeurs ont utilisé des nombres 32 bits car ils sont plus rapides, et la plupart des jeux à l'époque n'avaient pas besoin de précision supplémentaire (ils utilisaient donc des flotteurs et non des doubles).

Les trois systèmes peuvent effectuer des opérations flottantes à simple et double précision, mais ce n'est peut-être pas en raison des performances. (bien qu'à peu près tout après le n64 utilisait un bus 32 bits donc ...)

Alex
la source
1

Tout d'abord, float et double sont tous deux utilisés pour la représentation des nombres fractionnaires. Ainsi, la différence entre les deux provient du fait avec quelle précision ils peuvent stocker les nombres.

Par exemple: je dois stocker 123.456789. L'un peut ne stocker que 123.4567 tandis que d'autres peuvent stocker l'exact 123.456789.

Donc, fondamentalement, nous voulons savoir à quel point le nombre peut être stocké avec précision et c'est ce que nous appelons la précision.

Citant @Alessandro ici

La précision indique le nombre de chiffres décimaux corrects, c'est-à-dire sans aucune sorte d'erreur de représentation ou d'approximation. En d'autres termes, il indique le nombre de chiffres décimaux pouvant être utilisés en toute sécurité.

Float peut stocker avec précision environ 7 à 8 chiffres dans la partie fractionnaire tandis que Double peut stocker avec précision environ 15 à 16 chiffres dans la partie fractionnaire

Ainsi, double peut stocker le double de la quantité de partie fractionnaire à partir du flottant. C'est pourquoi Double s'appelle le double du flotteur

djbtalk
la source
0

Conformément à la norme IEEE754 • Standard pour le stockage en virgule flottante • Standards 32 et 64 bits (simple précision et double précision) • Exposant 8 et 11 bits respectivement • Formats étendus (mantisse et exposant) pour les résultats intermédiaires

Abdullah Al Mamun
la source
-3

Le nombre simple précision utilise 32 bits, le MSB étant un bit de signe, tandis que le nombre double précision utilise 64 bits, MSB étant un bit de signe

Précision simple

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Double precision:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Steve Bennett
la source