Afficher un float

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 29 mars 2005 à 20:13
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 - 30 mars 2005 à 19:36
Bonjour a tous

J'essaie de faire une fonction pour mettre un float dans un char*. Le
problème, c'est que quand je veux afficher 17.15 par exemple, ca pose
problème puisque 15 ne peut pas être codé précisément, j'affiche donc
17.14999961853027343750000.

Y-a-t il bon moyen pour éviter cela.

D'un autre coté, si on affiche 17.15, ca veut dire que quand on veut
réellement afficher 17.14999961853027343750000, on ne peut pas...

Comment dois-je faire?

Merci
A voir également:

11 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
29 mars 2005 à 20:48
Pas compris le problème pour ma part.

Shell
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 mars 2005 à 20:55
Non en fait le problème que j'ai n'a pas de solution, printf donne le même résultat:



float f = 17.15f;

printf("%f", f); affiche bien 17.150000

mais

printf("%.6f", f); affiche 17.1499996
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
29 mars 2005 à 21:18
Bizarre ton résultat.
Dans tout les cas tu devrais obtenir la meme chose.
Tout du moins, sous gcc on obtient 17.150000 pour chacune des ecritures, ce qui au passage parrait normal.

%0.6f ne fait que tronquer a 6 décimales après la virgules.
puis %f n'affiche que 6 décimal par défaut.

Faut voir du coté des otpimisations du compilo.

Shell
tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 2
29 mars 2005 à 21:21
utilise des "double"

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 mars 2005 à 21:37
Je travaille avec des floats, c'est un choix. Regardez comment sont
codés les floats en mémoire, et vous verrez qu'il est impossible de
coder la partie décimale 15:

0.15=10011001...1001....



Rien a voir avec les optimisation du compilateur à mon sens
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
30 mars 2005 à 09:26
Ca faudrait demandé a BruNews.
En tous cas ca paraitrai bete que 0.15 se transforme en 0.1499996 en mémoire...

Shell
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
30 mars 2005 à 10:07
Mais pas du tout. On a 32 bits, donc il n'est pas possible de coder
précisément tous les réels. Regarde le codage avec la norme IEEE 754
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
30 mars 2005 à 11:38
Je ne connais pas toute ces normes de codage.
Ce qui me parait bizarre c'est que 0.15 serait alors codait 0.149996.
L'erreur est minime mais le résultat est faux.

En tous cas comme tu le dis c'est probablement une histoire de normalisation, aussi tordu soit elle.

Shell
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
30 mars 2005 à 15:10
Je crois que si elle était tordue on l'aurait pas choisit... Essaie de
trouver une autre facon de coder le même intervalle de nombre réels et
tu verras que ce n'est pas si simple.

0.15 est codé par 0.125 + 0,015625+...
cleter Messages postés 92 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 15 mai 2006
30 mars 2005 à 17:57
oula, heu vous partez un peu loin dans le détail la....

Certe le 0.15 n'est peu etre pas codable (encore que....jai pa
vérifié), mais la fonction printf() est suffisement abouti pour fair
les arondi qui vont bien et afficher le bon résulat. donc tu na pas a
te poser de pb de ce coté la.

par contre, d'apres ce que je voi, tu as:



17.14999961853027343750000



et quand tu l'affiche ca te donne ca:





float f = 17.15f;

printf("%f", f); affiche bien 17.150000

mais

printf("%.6f", f); affiche 17.1499996



bein je voi pas vraiment ou est le pb... le seul truc qui m'étonne,
c'est que tu fasse %.6f et que ca te mette 7 chiffre apres la virgule.
(essaye avec %2.6f)



mais quand tu mes %f, tu a 6 chiffre apres la virgule, donc ca regarde
le 7eme, ici c'est le chiffre 6, donc il arrondi au chiffre superieur
le 6eme chiffre, comme c'est un 9, ca se repercute et ca te donne
17.150000



par contre si tu affiche 7 chiffre apres la virgule, le 8eme etant
<5 les 7premiers restes inchangé.... d'ou ton 2eme résultat....

c'est comme ca qu'on fait un arrondi (je croi qu'on le voi au colege )

Et ton printf, il a été au college et il a retenu la lecon lol.....



donc perso, je ne vois pas de probleme... tout est normal, la norme
IEEE.... fonctionne tres bien, et la seule chose qui parait bizar dans
tes résultats c'est qu'il taffiche 7 chiffre au lieu de 6 demandé...
mais bon, c'est pas le meme pb.
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
30 mars 2005 à 19:36
Les float, les double ou meme les long double (80bits) ne sont pas
precis. La façon dont ils représentent les nombres réels permet juste
de les approximer, d'un autre coté leur traitement est rapide (fpu).

Regardes du coté de gmp (grands flottants ou grands entiers avec partie décimale).
Rejoignez-nous