158 votes

flotteur vs double précision

Le code suivant

  float x = 3.141592653589793238;
  double z = 3.141592653589793238;
  printf("x=%f\n", x);
  printf("z=%f\n", z);
  printf("x=%20.18f\n", x);
  printf("z=%20.18f\n", z);

vous donnera la sortie

x=3.141593
z=3.141593
x=3.141592741012573242
z=3.141592653589793116

où sur la troisième ligne de sortie 741012573242 déchets et sur la quatrième ligne, 116 est des ordures. Faire des doubles de toujours avoir 16 chiffres significatifs alors que les chars ont toujours 7 chiffres significatifs? Pourquoi ne pas doubles disposent de 14 chiffres significatifs?

157voto

Alan Geleynse Points 11842

Les nombres à virgule flottante en C utilisent la norme IEEE 754 encodage.

Ce type de codage utilise un signe, un significande, et un exposant.

En raison de cet encodage, vous ne pouvez pas garantir que vous n'aurez pas un changement dans votre valeur.

Aussi, le nombre de chiffres significatifs peuvent changer légèrement, car il est une représentation binaire, pas une virgule.

Simple précision (float) vous donne 23 bits de significande, 8 bits d'exposant, et 1 bit de signe.

Double précision (double) vous donne 52 bits de significande, 11 bits d'exposant, et 1 bit de signe.

45voto

Stephen Canon Points 58003

Faire des doubles de toujours avoir 16 significative des chiffres flotte toujours 7 chiffres significatifs?

Pas de. Les Doubles ont toujours 53 significative bits et les flotteurs ont toujours 24 significative bits (sauf pour denormals, infinis, et des valeurs NaN, mais ce sont des sujets pour une autre question). Ce sont des formats binaires, et vous ne pouvez parler clairement à propos de la précision de leurs représentations en termes de chiffres binaires (bits).

Ceci est analogue à la question de savoir combien de chiffres peuvent être stockées dans un entier binaire: un entier non signé de 32 bits entier peut stocker des entiers de 32 bits, ce qui n'est pas, justement, la carte à n'importe quel nombre de chiffres décimaux: tous les nombres entiers jusqu'à 9 chiffres après la virgule peuvent être enregistrées, mais un lot de 10 chiffres peuvent être stockées en tant que bien.

Pourquoi ne pas en double 14 chiffres significatifs?

L'encodage d'un double utilise 64 bits (1 bit pour le signe, 11 bits pour l'exposant, 52 explicite bits significatifs et un implicite bits), ce qui est le double du nombre de bits utilisés pour représenter un float (32 bits).

11voto

user470379 Points 3935

Il est généralement basé sur des chiffres significatifs à la fois de l'exposant et significande en base 2, pas de base 10. À partir de ce que je peux dire dans le standard C99, cependant, il n'y a pas de précision spécifiée pour des flotteurs et des doubles (autre que le fait que 1 et 1 + 1E-5 / 1 + 1E-7 sont à distinguer [float et double repsectively]). Cependant, le nombre de chiffres significatifs est laissée à l'exécutant (ainsi que de base ils utilisent en interne, en d'autres mots, une mise en œuvre pourrait décider de le faire sur la base de 18 chiffres de précision dans la base 3). [1]

Si vous avez besoin de connaître ces valeurs, les constantes FLT_RADIX et FLT_MANT_DIG (et DBL_MANT_DIG / LDBL_MANT_DIG) sont définis dans le flotteur.h.

La raison pour laquelle il est appelé un double est parce que le nombre d'octets utilisés pour stocker, c'est le double du nombre de float (mais cela inclut à la fois l'exposant et significande). La norme IEEE 754 (utilisé par la plupart des compilateurs) à allouer relativement plus de bits pour le significande que l'exposant (23 à 9 float vs 52 à 12 double), raison pour laquelle la précision est plus que doublé.

1: Section 5.2.4.2.2 ( http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf )

9voto

Chris Nash Points 1753

Un flotteur a 23 bits de précision, et une double dispose de 52.

3voto

Mehrdad Points 70493

Ce n'est pas exactement le double de la précision car de la façon dont la norme IEEE 754 œuvres, et parce que le binaire n'a pas vraiment de notion de nombre décimal. Jetez un oeil à la norme, si vous êtes intéressé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X