IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Probleme de conversion string/double avec valeurs tres petites


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    D�cembre 2007
    Messages
    23
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2007
    Messages : 23
    Par d�faut Probleme de conversion string/double avec valeurs tres petites
    Bonjour,

    J'ai un etrange probleme quand je convertis des nombres d'un string vers double.

    J'ai un fichier avec des nombres en ligne:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    5.6 0 0.205867 1.0809 7.22644 0.373206 -5.84675e-317 1.99995 0.00433641 1.45331e-45
    Je veux inserer ces nombres sous forme de doubles dans un vecteur de doubles.
    Mon probleme apparait avec de tres petites valeurs (inferieures a 1e-310).

    Avec ce code:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    vector<double> vals;
    double x;
    while (stream >> x) {
          vals.push_back(x);
    }
    le vecteur vals est tronque : 5.6 0 0.205867 1.0809 7.22644 0.373206
    -5.84675e-317 est elimine et je sors de la boucle.

    C'est pareil en utilisant la STL:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    copy(istream_iterator<double>(stream), istream_iterator<double>(), back_inserter(linevals) );
    En revanche cette methode fonctionne:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    vector<double> vals;
    double x;
    string st;
    while (stream >> st) {
          x = atof(st.c_str());
          vals.push_back(x);
    }
    Pourquoi seul atof est capabble de convertir des valeurs tres petites?

    Merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    D�cembre 2007
    Messages
    23
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2007
    Messages : 23
    Par d�faut
    Note: j'utilise gcc/g++ 4.2.2 sous Unix (IBM AIX).

    Note2: il semble que les nombres < a 1e-310 sont denormalises, ca vient peut-etre de la. Maintenant pourquoi les nombres denormalises sont bien traites, je ne sais pas.

  3. #3
    Membre �prouv� Avatar de BoudBoulMan
    Profil pro
    �tudiant
    Inscrit en
    Juin 2006
    Messages
    100
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    Par d�faut
    Peut-�tre est-ce le caract�re 'e' qui n'est pas reconnu?

  4. #4
    Membre �m�rite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par d�faut
    Le probl�me provient surement du fait que la valeur est inf�rieur � DBL_MIN (�gal � 2.2250738585072014e-308 le plus souvent). Par contre je ne sais pas si la norme sp�cifie si l'extraction doit �chouer, si l'extraction doit donner 0.0 ou si c'est un comportement ind�fini.

  5. #5
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Sous toutes r�serves...
    Citation Envoy� par Sylvain Togni Voir le message
    Le probl�me provient surement du fait que la valeur est inf�rieur � DBL_MIN (�gal � 2.2250738585072014e-308 le plus souvent). Par contre je ne sais pas si la norme sp�cifie si l'extraction doit �chouer, si l'extraction doit donner 0.0 ou si c'est un comportement ind�fini.
    Le comportement est vaguement d�fini. Attention, c'est un peu compliqu� :
    1) C'est celui de scanf "%el", c'est � dire - par ricochet - � celui de strtod().

    2) La norme C99 dit alors :
    The functions return the converted value, if any. If no conversion could be performed, zero is returned. If the correct value is outside the range of representable values, plus or minus HUGE_VAL, HUGE_VALF, or HUGE_VALL is returned (according to the return type and sign of the value), and the value of the macro ERANGE is stored in errno. If the result underflows (7.12.1), the functions return a value whose magnitude is no greater than the smallest normalized positive number in the return type; whether errno acquires the value ERANGE is implementation-defined.
    3) Selon l'impl�mentation C++ utilis�e, cela se traduira peut-�tre par la mise � true du failbit du stream - si errno est mis � ERANGE et que le stream r�cup�re la valeur de errno. Hors l'expression "while (stream >> x) { }" est �quivalente � "while (stream >> x, !stream.fail()) { }" ce qui provoque la sortie de ta boucle.

    4) dans le dernier exemple, puisque atof() est un alias de strtod(), tu h�rite du m�me comportement. Mais puisque tu ne v�rifie pas errno, ta boucle fonctionne.

    Enfin bref - c'est un peu compliqu� (mais l'id�e est que tu sors de ta boucle parce qu'il y a une erreur quelconque, que tu ne reproduit pas dans l'autre boucle parce que tu n'utilises pas les m�me m�canismes).
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre averti
    Inscrit en
    D�cembre 2007
    Messages
    23
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2007
    Messages : 23
    Par d�faut
    Merci beaucoup pour ces reponses et commentaires. En fait, j'ai verifie le programme sous Linux avec la meme version de g++, et cela marche! Le probleme est specifique a la plateforme AIX. J'ai rapporte l'observation sur le bugzilla de GCC, en attendant de voir si c'est bien un bug.

Discussions similaires

  1. double avec valeur NaN
    Par ep31 dans le forum Langage
    R�ponses: 3
    Dernier message: 18/09/2007, 15h24
  2. R�ponses: 2
    Dernier message: 24/08/2007, 10h20
  3. Probleme de conversion String -> Date avec SimpleDateFormat.parse(String)
    Par jeanlouis_lecodeur dans le forum Collection et Stream
    R�ponses: 4
    Dernier message: 02/07/2007, 09h18
  4. La Conversion String-->Double
    Par jejermoa dans le forum Langage
    R�ponses: 3
    Dernier message: 07/05/2007, 09h55
  5. Probleme de conversion entre . et , avec une macro excel
    Par fmris dans le forum Macros et VBA Excel
    R�ponses: 2
    Dernier message: 18/01/2007, 22h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo