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

kaervas
|
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
|
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
|
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
|
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
|
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
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|