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

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 relatifs aux consoles de jeux vidéo. Par exemple, la Nintendo 64 dispose-t-elle d’un processeur 64 bits et, si tel est le cas, cela signifie-t-il qu’elle est capable d’opérations à double virgule flottante en double précision? Les systèmes PS3 et Xbox 360 peuvent-ils effectuer des opérations à virgule flottante double précision ou seulement une seule précision et, de manière générale, les capacités de double précision sont-elles utilisées (si elles existent?).

Note: la Nintendo 64 a cependant un processeur 64 bits:

De nombreux jeux tirent parti du mode de traitement 32 bits de la puce, car les jeux 3D ne requièrent généralement pas la plus grande précision des données disponibles avec les types de données 64 bits. Le traitement des données 64 bits nécessite deux fois plus de mémoire cache. , et la bande passante, réduisant ainsi les performances globales du système.

De Webopedia :

Le terme double précision est quelque peu trompeur 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 aussi la gamme des grandeurs pouvant être représentées.
La quantité exacte par laquelle la précision et la gamme de grandeurs sont augmentées dépend du format utilisé par le programme pour représenter les valeurs à virgule flottante.
La plupart des ordinateurs utilisent un format standard appelé format à virgule flottante IEEE.

De la norme IEEE pour l’arithmétique en virgule flottante

Précision unique

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

  • Le premier bit est le bit de signe , 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 non nul, alors V = NaN (“Pas un nombre”)
  • Si E = 255 et F est nul et S est 1, alors V = -Infinity
  • Si E = 255 et F est nul et S est 0, alors V = Infini
  • Si 0 alors V=(-1)**S * 2 ** (E-127) * (1.F) où "1.F" est destiné à représenter le nombre binary créé en préfixant F avec un implicite 1 et un point binary.
  • Si E = 0 et F est non nul, alors V=(-1)**S * 2 ** (-126) * (0.F) . Ce sont des valeurs "non normalisées".
  • Si E = 0 et F est nul et S est 1, alors V = -0
  • Si E = 0 et F est nul 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é par un numéro de 0 à 63, de gauche à droite.

  • Le premier bit est le bit de signe , S,
  • les onze bits suivants sont les bits de l' exposant , "E", et
  • les 52 bits finaux 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 non nul, alors V = NaN ("Pas un nombre")
  • Si E = 2047 et F est nul et S est 1, alors V = -Infinity
  • Si E = 2047 et F est nul et S est 0, alors V = Infini
  • Si 0 alors V=(-1)**S * 2 ** (E-1023) * (1.F) où "1.F" est destiné à représenter le nombre binary créé en préfixant F avec un implicite 1 et un point binary.
  • Si E = 0 et F est non nul, alors V=(-1)**S * 2 ** (-1022) * (0.F) Ce sont des valeurs "non normalisées".
  • Si E = 0 et F est nul et S est 1, alors V = -0
  • Si E = 0 et F est nul et S est 0, alors V = 0

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

Je lis beaucoup de réponses mais aucune ne semble expliquer correctement l’origine du mot double . Je me souviens d’une très bonne explication donnée par un professeur d’université que j’ai eu il y a quelques années.

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

  • 1 bit pour le signe , S
  • 8 bits pour l’ exposant , ‘E’
  • 24 bits pour la fraction , également appelée mantisse , ou coefficient (même si seulement 23 sont représentés). Appelons ça «M» (pour la mantisse , je préfère que ce nom soit «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 en 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 pouvez le constater, j’ai écrit que la mantisse a, dans les deux types, un peu plus d’informations que sa représentation. En fait, la mantisse est un nombre représenté sans tout son 0 non significatif. 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 binary, α 1 sera toujours égal à 1, donc la fraction peut être réécrite comme 1.α 2 α 3 … α t + 1 × 2 p et l’initiale 1 peut être implicitement supposée, faire de la place pour un bit supplémentaire (α t + 1 ).

Maintenant, il est évident que le double de 32 est de 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 erreur de représentation ou d’approximation. En d’autres termes, il indique combien de chiffres décimaux on peut utiliser 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é:

  • simple précision : 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

La différence fondamentale à la machine est que la double précision utilise deux fois plus de bits que la simple précision. Dans l’implémentation habituelle, c’est 32 bits pour un seul, 64 bits pour un 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 bits; une double précision a 52 bits pour la mantisse et un maximum d’environ 308.

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

En ce qui concerne la question “Est-ce que les opérations ps3 et xbxo 360 peuvent effectuer des opérations à virgule flottante double précision ou seulement une précision simple et si les capacités de double précision sont utilisées (si elles existent?).”

Je crois que les deux plates-formes sont incapables de double virgule flottante. Le processeur d’origine de la cellule n’avait que des flotteurs 32 bits, de même que le matériel ATI sur lequel la XBox 360 est basée (R600). La cellule a reçu un double support en virgule flottante plus tard, mais je suis sûr que la PS3 ne l’utilise pas.

Pour append à toutes les merveilleuses réponses ici

Tout d’abord, float et double sont tous deux utilisés pour la représentation des nombres fractionnaires. Donc, la différence entre les deux découle du fait qu’avec la précision avec laquelle ils peuvent stocker les nombres.

Par exemple: je dois stocker 123.456789 On peut être en mesure de stocker seulement 123.4567 tandis que d’autres peuvent être en mesure de stocker exactement 123.456789.

Donc, fondamentalement, nous voulons savoir avec quelle précision le numéro peut être stocké 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 erreur de représentation ou d’approximation. En d’autres termes, il indique combien de chiffres décimaux on peut utiliser 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 fraction. C’est pourquoi Double s’appelle le double du flottant

Fondamentalement, l’arithmétique à virgule flottante simple précision traite les nombres à virgule flottante de 32 bits, tandis que la double précision traite les nombres à 64 bits.

Le nombre de bits en double précision augmente la valeur maximale pouvant être stockée tout en augmentant la précision (c’est-à-dire le nombre de chiffres significatifs).

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

Le N64 utilise un processeur NEC VR4300 basé sur MIPS R4300i, qui est un processeur 64 bits, mais le processeur communique avec le rest du système via un bus de 32 bits. Ainsi, la plupart des développeurs ont utilisé des nombres de 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 non doubles).

Les trois systèmes peuvent effectuer des opérations flottantes en simple et en double précision, mais cela n’est peut-être pas dû aux performances. (bien quasiment tout après la n64 utilisait un bus 32 bits alors …)

Selon la norme IEEE754 • Norme de stockage en virgule flottante • Normes 32 et 64 bits (simple précision et double précision) • Exposant de 8 et 11 bits respectivement • Formats étendus (à la fois la mantisse et l’exposant) pour les résultats intermédiaires

Le nombre simple précision utilise 32 bits, le MSB étant le bit de signe, alors que le nombre double précision utilise 64 bits, le MSB étant le bit de signature.