Confusion avec les nombres en virgule flottante

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

Sortie:

  340.000000 // ça va. 

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

Pourquoi les sorties sont-elles comme celles-ci? Je pense que si j’écris x=3.1234e2 la sortie devrait être 312.340000 , mais la sortie réelle est 312.339996 aide du compilateur GCC.

Tous les nombres fractionnaires n’ont pas un équivalent binary exact et sont donc 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 indiqué par 0.125.

Bien sûr, les vraies différences sont beaucoup plus petites.

Les nombres à virgule flottante sont normalement représentés sous forme de fractions binarys fois une puissance de deux, par souci d’efficacité. Ceci est à peu près aussi précis que la représentation en base 10, sauf qu’il existe des fractions décimales qui ne peuvent pas être représentées exactement en tant que fractions binarys. Ils sont plutôt représentés sous forme d’approximations.

De plus, un float est normalement long de 32 bits, ce qui signifie qu’il n’a pas beaucoup de chiffres significatifs. Vous pouvez voir dans vos exemples qu’ils ont une précision d’environ 8 chiffres significatifs.

Cependant, vous imprimez les chiffres légèrement au-delà de leur signification, et vous voyez donc la différence. Consultez la documentation de votre printf format printf pour savoir 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 des nombres, ou tout simplement tout calculer en tant qu’entiers (par exemple, représenter des montants en cents plutôt qu’en dollars et en fractions de dollars).

La référence standard est Ce que tous les informaticiens devraient savoir sur l’arithmétique en virgule flottante , mais il semble que ce serait très avancé pour vous. Vous pouvez également utiliser Google pour les formats à virgule flottante (en particulier les formats standard IEEE) ou les rechercher sur Wikipedia si vous souhaitez en connaître les détails.