C float et doubles comparaisons

Je compare les flottants simples et les doubles en C, en particulier la valeur 8.7 pour les deux. Maintenant, j’atsortingbue 8.7 à chaque variable, lorsque j’imprime, j’obtiens un résultat de 8.7000 pour les deux valeurs. Pourquoi le compilateur a-t-il ajouté ces zéros? Et la principale question que je voulais poser était la suivante: y a-t-il d’autres chiffres que je ne vois pas, comme cachés après les zéros finaux. J’ai lu que je ne devrais pas faire des comparaisons comme celle-ci avec float à cause d’un manque de précision, mais j’ai pensé qu’avec une valeur aussi petite, il pouvait sûrement stocker 8.7 avec un degré de précision nécessaire pour se comparer à une autre valeur de 8.7?

Mon seul souci est qu’elle soit représentée quelque part dans la mémoire, par exemple 8.70000003758, ou quelque chose du genre, ce qui fausse mes comparaisons. J’ai essayé d’imprimer avec% .20f pour voir tous les autres nombres qui pourraient se cacher, mais je pense que cela vient de créer des nombres qui n’existaient pas autrement car toute l’exactitude du nombre est passée à 8.6918734634834929 ou à un résultat similaire.

Je compare les flottants simples et les doubles en C, en particulier la valeur 8.7 pour les deux.

Mauvais choix, car 8.7 n’a pas de représentation binary exacte.

Maintenant, j’atsortingbue 8.7 à chaque variable, lorsque j’imprime, le résultat obtenu est 8.7000 pour les deux valeurs. Pourquoi le compilateur a-t-il ajouté ces zéros?

Ce n’est pas le cas, votre routine d’impression l’a.

Et la principale question que je voulais poser était la suivante: y a-t-il d’autres chiffres que je ne vois pas, comme cachés après les zéros finaux.

Certainement, depuis 8.7 n’a pas de représentation binary exacte. (Essayez de l’écrire comme la sum des puissances entières de 2, vous ne pouvez pas le faire.)

J’ai lu que je ne devrais pas faire des comparaisons comme celle-ci avec float à cause d’un manque de précision, mais j’ai pensé qu’avec une valeur aussi petite, il pouvait sûrement stocker 8.7 avec un degré de précision nécessaire pour se comparer à une autre valeur de 8.7?

Tu as mal pensé. 1/3 est petit mais n’a pas de représentation décimale exacte avec un nombre fini de chiffres. Qu’une valeur soit grande ou petite n’a rien à voir avec le fait qu’elle puisse être représentée exactement par un nombre fini de chiffres dans une base donnée.

Mon seul souci est qu’elle soit représentée quelque part dans la mémoire, par exemple 8.70000003758, ou quelque chose du genre, ce qui fausse mes comparaisons.

Exactement, tout comme représenter 1/3 comme le ferait 0.333333333 .

J’ai essayé d’imprimer avec% .20f pour voir tous les autres nombres qui pourraient se cacher, mais je pense que cela vient de créer des nombres qui n’existaient pas autrement car toute l’exactitude du nombre est passée à 8.6918734634834929 ou à un résultat similaire.

C’est probablement juste un bug. Montre-nous ce code. Peut-être avez-vous essayé de sortir un double et laissé de côté le l .