Étrange résultat de la division en C

Quelques doublons:
1,265 * 10000 = 126499.99999999999 ????
Comment la virgule flottante est-elle stockée? Quand est-ce important?
Comportement étrange en virgule flottante dans un programme Java
Pourquoi vois-je une variable double initialisée à une valeur telle que 21.4 sous la forme 21.399999618530273?
Erreur lors de l’ajout de Flash

Je divise 23 par 40 (23/40). En C, cette opération donne 0,5749999999999996. Mais en réalité ce doit être 0.575!

Comment puis-je réparer cela?

Le problème est que la valeur .575 n’a pas une représentation exacte dans le codage en virgule flottante. Le correctif dépend de ce que vous avez à faire avec la valeur ainsi que de l’impact de l’inexactitude.

S’il ne s’agit que d’un problème d’affichage, arrondissez à 3 décimales et vous obtiendrez le 0.575.

Si c’est à cause d’une imprécision de calcul, essayez de conserver la valeur sous forme de fraction qui sera exacte. Vous devrez stocker et gérer deux valeurs en virgule flottante, mais ce sera exact. Reporter la division effective au dernier moment lorsque vous avez besoin du résultat.

Vérifiez si la différence entre les deux valeurs est pertinente pour votre problème. Par exemple, soustrayez sqrt epsilon à la valeur et vérifiez dans quelle mesure le changement influe sur le résultat du calcul final et comparez-le avec la précision requirejse ou désirée.

Malheureusement, nous devons vivre avec la limitation de la représentation de la valeur réelle dans float. L’utilisation de valeurs flottantes avec une précision de 128 bits rendra l’erreur beaucoup plus petite mais non nulle.

Jetez un coup d’oeil à ceci – il devrait vous dire tout ce que vous devez savoir sur Pourquoi les ordinateurs craignent les maths

C’est un artefact de la façon dont les nombres en virgule flottante sont stockés.

Vous pouvez soit arrondir la réponse sprintf (“%. 3f”, résultat), soit utiliser un package de traitement décimal.

Je vous suggère de faire une recherche sur le Web pour “précision en virgule flottante” ou de regarder les dizaines de questions absolues sur SO afin que le vôtre soit un doublon.

C’est normal avec l’arithmétique en virgule flottante . Vous pouvez changer la façon dont vos float s et double s sont imprimés en utilisant% .3g par exemple

Vous ne pouvez pas réparer ça. Tous les nombres ne peuvent pas être représentés sous forme de nombres flottants, voir “comment la virgule flottante est-elle stockée, quand est-ce important” .