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

StackOverflow https://stackoverflow.com/questions/801117

Question

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 aspects pratiques liés aux consoles de jeux vidéo. Par exemple, la Nintendo 64 a-t-elle un processeur 64 bits et si tel était le cas, cela signifierait-il qu'elle était capable d'opérations en virgule flottante en double précision? La PS3 et la Xbox 360 peuvent-elles exécuter des opérations en virgule flottante à double précision ou uniquement à simple précision? Les fonctionnalités à double précision sont généralement utilisées (le cas échéant).

Était-ce utile?

La solution

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

  

De nombreux jeux ont tiré parti du mode de traitement 32 bits de la puce, car les jeux 3D n’exigent généralement pas une plus grande précision des données, mais le traitement des données 64 bits en utilise deux fois plus. RAM, cache et bande passante, réduisant ainsi les performances globales du système.

De la Webopedia :

  

Le terme double précision est impropre dans la mesure où la précision n’est pas vraiment double.
  Le mot double provient du fait qu'un nombre à double précision utilise deux fois plus de bits qu'un nombre à virgule flottante normal.
  Par exemple, si un nombre simple précision nécessite 32 bits, sa contrepartie double précision aura une longueur de 64 bits.

     

Les bits supplémentaires augmentent non seulement la précision, mais également la plage de magnitudes pouvant être représentées.
  Le montant exact de l'augmentation de la précision et de la plage de grandeurs 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.

Extrait du norme IEEE pour l'arithmétique en virgule flottante

Simple précision

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

  • Le premier bit est le signe , S,
  • .
  • les huit bits suivants sont les exposants , '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 que F est différent de zéro, alors V = NaN (" pas un nombre ")
  • Si E = 255 et F sont zéro et S est 1, alors V = -Infinity
  • Si E = 255 et F sont zéro et S est 0, alors V = Infinity
  • Si 0<E<255 alors 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). Celles-ci sont & "non normalisés &"; valeurs.
  • 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 précision

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

  • Le premier bit est le signe , S,
  • .
  • les onze prochains bits sont les exposants , '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 que 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 égal à zéro et S est égal à 0, alors V = Infinity
  • Si 0<E<2047 alors 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) ces sont & "non normalisés &"; valeurs.
  • 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 en virgule flottante.

Autres conseils

J'ai lu 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’avais eu il ya quelques années.

Rappelant le style de la réponse de VonC, une représentation en virgule flottante de précision single 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-le "M" (pour mantisse , je préfère ce nom car la & "; Fraction &"; Peut être mal comprise).

Représentation:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(Juste pour préciser, le bit de signe est le dernier, pas le premier.)

Une double représentation en virgule flottante de 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 contient, dans les deux types, un peu plus d'informations que sa représentation. En fait, la mantisse est un nombre représenté sans toutes ses non-significatives 0. Par exemple,

  • 0,000124 devient 0,124 & # 215; 10 & # 8722; 3
  • 237.141 devient 0,237141 & # 215; 10 3

Cela signifie que la mantisse sera toujours sous la forme

0. & # 945; 1 & # 945; 2 ... & # 945; t & # 215; & # 946; p

où & # 946; est la base de la représentation. Mais comme la fraction est un nombre binaire, & # 945; 1 sera toujours égal à 1, ainsi la fraction peut être réécrite sous la forme 1. & # 945; 2 & # 945; 3 ... & # 945; t + 1 & # 215; 2 p et le 1 initial peut être implicitement supposé, ce qui laisse la place à un bit supplémentaire (& # 945; t + 1 ).

Maintenant, il est évident 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 erreur de représentation ou approximation. En d'autres termes, il indique le nombre de chiffres décimaux pouvant être 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 ), ce qui représente environ 7 à 8 chiffres décimaux
  • double précision : log 10 (2 53 ), soit environ 15 à 16 chiffres décimaux

D'accord, la différence fondamentale sur la machine est que la double précision utilise deux fois plus de bits qu'un simple. Dans l’implémentation habituelle, il s’agit de 32 bits en simple, de 64 bits en double.

Mais qu'est-ce que cela signifie ? Si nous supposons la norme IEEE, un nombre simple précision contient environ 23 bits de la mantisse et un exposant maximal d’environ 38; une double précision a 52 bits pour la mantisse et un exposant maximum d’environ 308.

Les détails se trouvent à Wikipedia , comme d'habitude.

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 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 stocker uniquement 123,4567, tandis que d'autres peuvent stocker le nombre exact 123,456789.

Nous voulons donc savoir quelle est la précision de stockage du nombre et quelle est la précision.

Citer @Alessandro ici

  

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

Float peut stocker avec précision environ 7 à 8 chiffres dans la partie décimale Double peut stocker avec précision environ 15-16 chiffres dans la partie décimale

Ainsi, float peut stocker le double de la fraction. C'est pourquoi Double est appelé le double du float

Concernant la question & "; ps3 et xbxo 360 peuvent-ils exécuter des opérations à virgule flottante en double précision ou uniquement en simple précision? En général, les fonctionnalités en double précision sont utilisées (si elles existent?). quot;

Je pense que les deux plates-formes sont incapables de faire double virgule flottante. Le processeur Cell d'origine ne comportait que des bits 32 bits, comme avec le matériel ATI sur lequel la XBox 360 est basée (R600). Par la suite, The Cell a pris en charge le double virgule flottante, mais je suis à peu près sûr que la PS3 n’utilisera pas cet effet chippery.

En gros, l'arithmétique en virgule simple traite des nombres à virgule flottante de 32 bits alors que double précision traite du 64 bits.

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

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 de 32 bits, donc les doubles sont de 64 bits. Cela signifie que les opérations sur les nombres en double précision prennent un peu plus de temps à exécuter. Vous obtenez donc une meilleure portée, mais les performances ne sont pas très sensibles. Ce succès 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 le MI43 R4300i qui est un processeur 64 bits, mais le processeur mais communique avec le reste du système via un bus de 32 bits. Ainsi, la plupart des développeurs ont utilisé des nombres 32 bits car ils sont plus rapides, et la plupart des jeux de l'époque n'avaient pas besoin de la précision supplémentaire (ils utilisaient donc des flotteurs et non des doubles).

Les trois systèmes peuvent effectuer des opérations flottantes en simple et double précision, mais ils risquent de ne pas le faire en raison des performances. (Bien que pratiquement tout après le n64 utilisait un bus 32 bits donc ...)

Selon l'IEEE754 & # 8226; Norme pour le stockage en virgule flottante & # 8226; Normes 32 et 64 bits (simple précision et double précision) & # 8226; Exposant 8 et 11 bits respectivement & # 8226; Formats étendus (mantisse et exposant) pour des résultats intermédiaires

Tout d’abord, float et double sont tous deux utilisés pour la représentation des nombres nombres fractionnaires. La différence entre les deux tient donc au fait qu’ils ont la précision de stocker les chiffres.

Par exemple: je dois stocker 123.456789. L’un peut stocker uniquement 123.4567, tandis que d’autres peuvent enregistrer le 123.456789 exact.

Nous voulons donc savoir quelle est la précision de stockage du nombre. C'est ce que nous appelons la précision.

Citer @Alessandro ici

La précision indique le nombre de chiffres décimaux corrects, c'est-à-dire sans erreur de représentation ou approximation. En d’autres termes, il indique le nombre de chiffres décimaux que l’on peut utiliser en toute sécurité.

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

.

Ainsi, double peut stocker le double de la quantité de la partie fractionnaire en tant que float. C’est pourquoi Double est appelé le double du flottant

Le nombre simple précision utilise 32 bits, le bit de poids fort étant le bit de signe, alors que le nombre double précision utilise le bit de 64 bits, le bit de poids fort étant le bit de signe

Simple précision

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Double précision:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top