Problème conversion chaîne en nombre

Problème conversion chaîne en nombre - C++ - Programmation

Marsh Posté le 26-02-2009 à 11:45:38    

Bonjour à tous!
 
Je viens vous voir car je rencontre un problème ; je souhaite convertir une chaîne de caractère en un nombre à virgule (float, double, etc). voilà ce que je fais :
 
char * pEnd; char c[] = "5.78";
float flt = strtod(c, &pEnd);
double db = strtod(c, &pEnd);
 
Mon problème, c'est que je me retrouve avec dans mon float : 5.7800002 et dans mon double : 5.7800000000000002
Pourquoi n'ai je pas les valeurs exactes, et d'où vient ce "2"...?
 
J'ai essayé avec un char* plutôt qu'avec un char[], et la fonction atoi plutôt que strtod, et toujours le même problème...
 
Aidez moi s'il vous plait!  :sweat:  
Merci!

Reply

Marsh Posté le 26-02-2009 à 11:45:38   

Reply

Marsh Posté le 26-02-2009 à 14:42:23    

Utilise un stringstream:
 
http://www.cplusplus.com/reference [...] tream.html


---------------
You can't start a fire with moonlight
Reply

Marsh Posté le 26-02-2009 à 14:52:04    

le 2 c'ets le defaut de représnetation des float en 32/64 bits.
5.78 = 0x40B8F5C3 = 5.7800002
 
http://babbage.cs.qc.edu/IEEE-754/Decimal.html

Reply

Marsh Posté le 26-02-2009 à 18:29:48    

baham a écrit :

Mon problème, c'est que je me retrouve avec dans mon float : 5.7800002 et dans mon double : 5.7800000000000002
Pourquoi n'ai je pas les valeurs exactes


 
Parce que la valeur exacte n'est pas représentable avec les formats flottants habituels.  Ces formats permettent de représenter des rationnels avec une puissance de 2 au dénominateur.

Reply

Marsh Posté le 26-02-2009 à 19:49:52    

Merci pour vos réponses!
 
Je reste donc sur l'imprécision... Le problème venait surtout du fait que je récupérais une liste de nombre d'un fichiers, et que ces nombres correspondaient à des pourcentages dont je vérifiais que la somme faisait bien 100...
 
J'ai simplement ajouté un epsilon à mon test.
 
@+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed