Question

int main()
{
  float x=3.4e2;
  printf("%f",x);
  return 0;
}

Sortie:

340.000000  // It's ok.

Mais si écriture x=3.1234e2 la sortie est 312.339996 et si x=3.12345678e2 la sortie est 312.345673.

Pourquoi les sorties comme celles-ci? Je pense que si j'écris x=3.1234e2 la sortie doit être 312.340000, mais la sortie réelle est 312.339996 en utilisant le compilateur GCC.

Était-ce utile?

La solution

Tous les nombres fractionnaires ont un équivalent exact binaire il est arrondi à la valeur la plus proche.

Exemple simplifié,

si vous avez 3 bits pour la fraction, vous pouvez avoir:

0
0.125
0.25
0.375
...

0,5 a une représentation exacte, mais 0,1 sera affiché comme 0,125.

Bien sûr, les différences réelles sont beaucoup plus petits.

Autres conseils

nombres à virgule flottante sont habituellement représentés sous forme de fractions binaires fois une puissance de deux, pour l'efficacité. Ceci est à peu près aussi précis que la représentation base 10, sauf qu'il ya des fractions décimales qui ne peuvent pas être exactement représentés sous forme de fractions binaires. Ils sont, au contraire, représentés comme des approximations.

En outre, un float est normalement longueur de 32 bits, ce qui signifie qu'il n'a pas tout ce que nombre de chiffres significatifs. Vous pouvez voir dans vos exemples qu'ils sont exacts à 8 chiffres significatifs.

Vous êtes, cependant, l'impression des chiffres légèrement au-delà de leur signification, et donc vous voyez la différence. Regardez la documentation de votre chaîne de format printf pour voir comment imprimer moins de chiffres.

Vous devrez peut-être représenter des nombres décimaux exactement; cela se produit souvent dans des applications financières. Dans ce cas, vous devez utiliser une bibliothèque spéciale pour représenter des nombres, ou tout simplement comme des entiers (calculer, comme la représentation des montants comme cents plutôt que comme des dollars et des fractions d'un dollar).

La référence standard est Ce que tout informaticien devrait savoir sur l'arithmétique en virgule flottante , mais il semble que ce serait très avancé pour vous. Sinon, vous pouvez Google formats à virgule flottante (en particulier IEEE formats standard) ou les consulter sur Wikipédia, si vous voulez les détails.

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