begin process at 2012 05 29 04:41:33
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Float *10


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Float *10

mercredi 14 décembre 2005 à 23:58:00 | Float *10

kaervas

Membre Club
Bonsoir, J'ai un soucis avec les floats: int main() { float nb = 3.11; nb *= 10; printf("%f", nb); } cc main.c && ./a.out 31.099998 comment ce fais-ce? J'aimerais avoir 31.1 comme resultat...
jeudi 15 décembre 2005 à 07:00:12 | Re : Float *10

neodelphi

Membre Club
Essaye
printf("%4f", nb);

et
nb *= 10.0f;

neodelphi
jeudi 15 décembre 2005 à 11:14:54 | Re : Float *10

ymca2003

Réponse acceptée !
C'est parce que les float font une approximation des valeurs décimales et certaines ne sont pas représentable exactement en mémoire
 
En fait le 3.11 et le 31.1 ont une représentation finie en décimal mais en réprésentation binaire c'est pas le cas. Du coup les calculs sont approchés.

Exemple : en décimal, il est impossible de représenté 1/3 avec un nombre fini de chifrres, si on se contente de 4 chiffres :
val = 1/3 => en fait en interne on aura 0.3333
val = val*3 => on aura en interne 0.9999 en non pas 1

Avec des double au lieu de float c'est pareil mais ca se voit moins parce que la précision est meilleurs.
jeudi 15 décembre 2005 à 14:00:48 | Re : Float *10

kortin

Oui, moi aussi, dans mon projet, je n'ai que des double et j'ai des valeurs qui dérapent vite !

Je crois que le C++ a besoin d'un type qui permettrait de meilleurs résultats.

vendredi 16 décembre 2005 à 06:40:53 | Re : Float *10

kaervas

Membre Club
neodelphi non ca change rien chez moi, mais je vois le probleme a peu pres, merci ymca2003. Les doubles ne posent pas de problemes sur cet exemple apparement. Ce probleme que j'avais etait pour mon recodage du printf %f, quand j'utilise un float, pour recuperer le float, ca marche mais la precision foire, par contre la j'ai essayer de recuper mon float avec un double et ca ne marche plus (il me met 0.0 dans tous les cas), je me sert d'int pour afficher les nombre apres et avant la virgule, peut-etre le cast du double en int bug? ( enfin c'est un autre probleme mais j'aimerais bien finir de maudit printf d: )
vendredi 16 décembre 2005 à 10:15:48 | Re : Float *10

kortin

Tu peux utiliser l'affichage que tu veux, les nombre stockés en mémoire sont FAUX !

même si tu avais un type doubledoubledouble, il serait toujours impossible de stocker 0.3
Regarde donc comment fonctionne la stockage d'une valeur dans la mantisse et essaie avec 0.3 => impossible.

J'ai déjà essayer d'écrire une lib qui serait un type exact, mais j'ai abandonné, je n'ai pas trouvé de solution évidente.

vendredi 16 décembre 2005 à 14:39:51 | Re : Float *10

kaervas

Membre Club
Oui mais c'etait pour faire un printf qui "aurait l'air" de bien gerer les floats, et puis meme si c'est faux, avec les doubles, tant que ca depasse pas les 6 nbres apres la virgule, ca affiche la bonne chose. On m'a dit de passer par le binaire, bon, plus tard =)
lundi 26 décembre 2005 à 19:51:59 | Re : Float *10

neodelphi

Membre Club
Je comprend pas pourquoi il ne pourrait pas stocker 3.11, si le stockage se fait avec une partie entiere pour les nombres et une autre pour la virgule, trois chiffre ça devrait passer nan ?

neodelphi
mardi 27 décembre 2005 à 15:24:03 | Re : Float *10

ymca2003

En décimal oui, en binaire non.

0.11 ne peut pas s'exprimer en puissance de 2
0.11 : 1/16 + 1/32 + 1/64 + 1/2048 + 1/8192 + 1/131072 = 0,10999298095703125

Donc on tombe pas sur 0.11 pile poil.





Cette discussion est classée dans : nb, main, float


Répondre à ce message

Sujets en rapport avec ce message

Variables globales [ par nisaloncaje ] Bonjour, je suis en train de créer un petit programme en c (j'utilise devc++) et j'ai un problème : je n'y comprends rien au variables globales !En ef Probleme d'exécution [ par jolio20 ] Bonjour à tous !Voila  je suis débutante en c. je dois faire un  programme qui me donne le max et le min  d'un tableau des reals  , le programme ne s' Algorithme de permutation [ par momsse ] Salut à tous, Presque tout est dans le titre, je n'arrive pas à comprendre cette algorthme en regardant les sources suivantes (qui fonctionnent parfa SDL et GLUT [ par Samaths ] Bonjour à tous!J'ai un petit problème: Je voudrais utiliser OpenGL et la SDL en même temps. Je sais que c'est possible, j'ai trouvé plein de tutoriaux Variable globale [ par jul39dole ] Bonjour,J'ai un programme écrit en C++, avec classe et objet. Malgré tout, j'aurai besoin d'une variable globale : un tableau dynamique (type float*). fwrite en mémoire.... [ par loicus ] Bonjour à tous...J'ai un très gros probleme.  Je travail avec des fichiers binaires en lecture et en écriture.Je n'ai aucun probleme avec l'utilisatio Problème avec les float [ par nico_44 ] Bonjour à toutes et à tous, J'ai un problème avec les float. Je communique avec une base de données dans laquelle est stockée notamment un tarif. L'u probleme variable avec Batch [ par romainbisson ] Bonjour,j'ai un probleme, lolje c'est pas comment recupérer la valeur d'une variable dans un programme main.exeje crée un fichier .batj'eris dedans :m win main [ par hasnafstm ] g un programme en winmain é je vx le reprogrammer en mfc c le jeu :mini golfe le probleme c ke je suis encore debutante é je c pa cmt faire


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,078 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales