vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
29 mars 2005 à 20:13
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 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...
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDerniè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.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201013 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és2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDerniè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.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201013 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.
cleter
Messages postés92Date d'inscriptionmardi 25 février 2003StatutMembreDernière intervention15 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és475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 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).