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

Sortie:Confusion avec des nombres à virgule flottante

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 sont-elles similaires? Je pense que si j'écris x=3.1234e2 la sortie devrait être 312.340000, mais la sortie réelle est 312.339996 en utilisant le compilateur GCC.

+3

jetez un oeil à: http://docs.sun.com/source/806-3568/ncg_goldberg.html – Max

Répondre

9

Tous les nombres fractionnaires n'ont pas un équivalent binaire exact, donc ils sont arrondis à 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 petites.

2

Les nombres à virgule flottante sont normalement représentés comme des fractions binaires multipliées par une puissance de deux, pour des raisons d'efficacité. C'est à peu près aussi précis que la représentation en base 10, sauf qu'il y a des fractions décimales qui ne peuvent pas être exactement représentées comme des fractions binaires. Ils sont, au contraire, représentés comme des approximations.

De plus, un float a normalement une longueur de 32 bits, ce qui signifie qu'il n'a pas beaucoup de chiffres significatifs. Vous pouvez voir dans vos exemples qu'ils sont précis à environ 8 chiffres significatifs. Cependant, vous imprimez les nombres légèrement au-delà de leur signification, et vous voyez donc la différence. Regardez votre documentation de chaîne de format printf pour voir comment imprimer moins de chiffres.

Vous devrez peut-être représenter les nombres décimaux exactement; Cela arrive souvent dans les applications financières. Dans ce cas, vous devez utiliser une bibliothèque spéciale pour représenter les nombres, ou simplement calculer tout comme des entiers (par exemple, représenter les montants en cents plutôt qu'en dollars et fractions de dollar).

La référence standard est What Every Computer Scientist Should Know About Floating-Point Arithmetic, mais il semble que ce serait très avancé pour vous. Alternativement, vous pouvez utiliser les formats à virgule flottante de Google (en particulier les formats standard IEEE) ou les consulter sur Wikipedia, si vous voulez les détails.

Questions connexes