web-dev-qa-db-fra.com

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

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

Je m'intéresse particulièrement aux 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 à virgule flottante à double précision ou uniquement à une seule précision et sont généralement utilisées les fonctionnalités à double précision (si elles existent?).

123
tweetypi

Remarque: la Nintendo 64 possède un processeur 64 bits, cependant:

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

De Webopedia :

Le terme double précision est impropre, car la précision n’est pas vraiment double.
Le double mot découle 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 requiert 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 des 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 en 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

Single Precision

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

  • Le premier bit est le bit signe, S, 
  • les huit bits suivants sont les bits exposant, 'E', et 
  • les 23 derniers bits sont les 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 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<255 puis 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 Implicite initial 1 et un point binaire.
  • Si E = 0 et que F est différent de zéro, alors V=(-1)**S * 2 ** (-126) * (0.F). Ces valeurs 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, pouvant être représenté par un numéro numéroté de 0 à 63, de gauche à droite. 

  • Le premier bit est le bit signe, S, 
  • les onze prochains bits sont les bits exposant, 'E', et 
  • les 52 derniers bits sont les 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 égal à zéro et S à 0, alors V = Infini
  • Si 0<E<2047 puis 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 Implicite initial 1 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 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,
Standard pour l’arithmétique binaire en virgule flottante.

178
VonC

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 eu il y a quelques années.

Rappelant le style de la réponse de VonC, une représentation en virgule flottante de précision {unique} _ 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 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 préciser, le bit de signe est le dernier, pas le premier.)

Une représentation en virgule flottante de précision {double} _ utilise un mot de 64 bits. 

  • 1 bit pour le signe, S
  • 11 bits pour le exposant, 'E'
  • 53 bits pour la fractionmantisse/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 × 103

Cela signifie que la mantisse sera toujours sous la forme

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

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

Maintenant, il est évident que le double de 32 est 64, mais ce n'est pas de là que vient la Parole.

Le _/précision indique le nombre de chiffres décimaux qui sont correct, c'est-à-dire sans erreur de représentation ou approximation. En d’autres termes, il indique le nombre de chiffres décimaux que vous pouvez 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: logdix(224), ce qui représente environ 7 ~ 8 chiffres décimaux
  • double précision: logdix(253), ce qui correspond à environ 15 ~ 16 chiffres décimaux
19
Alessandro

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, cela correspond à 32 bits pour un simple et à 64 bits pour un double.

Mais que signifie ? Si nous supposons la norme IEEE, un nombre simple précision contient 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.

16
Charlie Martin

Pour ajouter à toutes les merveilleuses réponses ici

Tout d'abord, float} _ et double sont tous deux utilisés pour la représentation de 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 enregistrer exactement 123.456789.

Nous voulons donc savoir quelle quantité de précision peut être stockée et que nous appelons précision. 

Citant @Alessandro ici

La précision indique le nombre de chiffres décimaux qui sont correct, c'est-à-dire sans erreur de représentation ni approximation. Dans En d’autres termes, il indique le nombre de chiffres décimaux que vous pouvez utiliser en toute sécurité.

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

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

7
SimpleGuy

En ce qui concerne la question "Les systèmes ps3 et xbxo 360 peuvent-ils exécuter des opérations à virgule flottante double précision ou uniquement des systèmes à simple précision et de manière générale?

Je crois que les deux plates-formes sont incapables de 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, Cell a pris en charge le double virgule flottante, mais je suis à peu près sûr que la PS3 n’utilisera pas cette technologie.

6
codekaizen

Fondamentalement, l'arithmétique en virgule flottante simple précision traite des nombres à virgule flottante 32 bits alors que double précision traite en 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).

4
cletus

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 de 32 bits, donc les doubles sont de 64 bits. Cela signifie que les opérations sur les nombres en double précision sont un peu plus longues à 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 MIPS R4300i qui est un processeur 64 bits, mais le processeur 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 alors ...)

1
Alex

Tout d'abord, float et double sont tous deux utilisés pour la représentation de 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. Un peut stocker uniquement 123.4567, tandis que d’autres peuvent stocker exactement le 123.456789.

Nous voulons donc savoir quelle quantité de précision peut être stockée et que nous appelons précision.

Citant @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 enregistrer avec précision environ 15 à 16 chiffres dans la partie fractionnée.

Ainsi, double peut stocker le double de la quantité de la fraction décimale comme float. C’est pourquoi Double s’appelle double le flotteur

0

Selon la norme IEEE754 • Norme pour le stockage en virgule flottante • Normes 32 et 64 bits (simple précision et double précision) ) pour des résultats intermédiaires

0
Abdullah Al Mamun