Mon nombre en virgule flottante a des chiffres supplémentaires lorsque je l’imprime

Je définis un nombre à virgule flottante comme étant une float transparency = 0.85f; Et à la ligne suivante, je le passe à une fonction – fcn_name(transparency) – mais il s’avère que la variable de transparency a pour valeur 0.850000002 et que, lorsque je l’imprime avec le paramètre par défaut, elle correspond à 0.850000002 . Pour la valeur 0.65f , il est 0.649999998 .

Comment puis-je éviter ce problème? Je sais que la virgule flottante n’est qu’une approximation, mais si je définis un flottant avec seulement quelques décimales, comment puis-je être sûr qu’il n’est pas modifié?

Les valeurs en virgule flottante représentées au format binary n’ont pas de précision décimale spécifique. Le fait que le nombre puisse représenter un nombre fixe de chiffres décimaux dans la spécification ne signifie pas grand-chose. Il ne s’agit que d’une conversion approximative de la précision binary physique (et significative) en une approximation décimale beaucoup moins significative.

L’une des propriétés du format binary à virgule flottante est qu’il ne peut représenter avec précision (dans les limites de la largeur de sa mantisse) que les nombres pouvant être exprimés sous forme de sums finies de puissances de 2 (y compris les puissances négatives de 2). Les nombres tels que 0.5 , 0.25 , 0.75 (décimal) seront représentés avec précision en format binary à virgule flottante, car ils sont soit des puissances de 2 ( 2^-1 , 2^-2 ), soit des sums correspondantes.

Par ailleurs, un nombre tel que décimal 0.1 ne peut pas être exprimé par une sum finie de puissances de 2. La représentation de la décimale 0.1 en binary à virgule flottante a une longueur infinie . Cela signifie immédiatement que 0.1 ne peut jamais être représenté précisément dans un format à virgule flottante binary fini. Notez que 0.1 a un seul chiffre décimal. Cependant, ce nombre n’est toujours pas représentable. Cela illustre le fait qu’il n’est pas très utile d’exprimer la précision en virgule flottante en chiffres décimaux.

Des valeurs telles que 0.85 et 0.65 de votre exemple sont également non représentables. C’est pourquoi vous les voyez déformées après la conversion en un format à virgule flottante binary fini. En fait, vous devez vous habituer au fait que la plupart des nombres décimaux fractionnaires que vous rencontrerez dans la vie de tous les jours ne pourront pas être représentés avec précision dans les types à virgule flottante binary, quelle que soit la taille de ces types .

La seule façon pour moi de résoudre ce problème consiste à transmettre séparément les caractéristiques et la mantisse à la fonction et à laisser le service informatique définir les valeurs de manière appropriée.

Aussi, si vous voulez plus de précision,

http://www.drdobbs.com/cpp/fixed-point-arithmetic-types-for-c/184401992 est l’article que je connais. Bien que cela ne fonctionne que pour C ++. (Recherche d’une implémentation C équivalente).

J’ai essayé ceci sur VS2010,

 #include  void printfloat(float f) { printf("%f",f); } int main(int argc, char *argv[]) { float f = 0.24f; printfloat(f); return 0; } OUTPUT: 0.240000