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 :

Bizzarerie de la fonction " atof "


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut Bizzarerie de la fonction " atof "
    Bonjour, j'utilise dans mon programme la fonction " atof " qui convertit une chaine en flottant et tout marchait bien jusqu'à un moment où elle décide d'arrondir à l'entier inférieur:

    elle a beau lire : 4.156165418 ou 2.91448919 elle sortira 4.000000 et 2.0000000

    ( je ne poste pas de code car il faudrait une centaine de ligne voire plus pour le comprendre lol )

    donc si c'est un problème connu ou si quelqu'un sait pourquoi merci bien car ça fausse toutes mes valeurs qui doivent être précises jusqu'à 10 chiffres après la virgule

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    Petite précision : INDEPENDAMMENT le programme fonctionne nickel et " atof " renvoie bien des bonnes valeurs, mais c'est lorsque je le rajoute " au gros " programme que cela se produit.

    Etant donné que le programme entier gère pas mal de tableaux de 400000 éléments ( pour un dictionnaire ) je me suis dit : peut-être que l'espace mémoire n'est plus suffisant pour que " atof " puisse éxécuter ses calculs

    qu'en pensez-vous ? je suis perdu à vrai dire lol

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    tu affiche ton resultat avec quoi ?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    essaye de ré-inclure le fichier <math.h> en dernière position des include dans ton fichier..

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par souviron34
    essaye de ré-inclure le fichier <math.h> en dernière position des include dans ton fichier..
    Ca ne changera absolument rien (protection contre les inclusions multiples). On peut éventuellement le déplacer en dernier.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par NeMo_O
    Petite précision : INDEPENDAMMENT le programme fonctionne nickel et " atof " renvoie bien des bonnes valeurs, mais c'est lorsque je le rajoute " au gros " programme que cela se produit.

    Etant donné que le programme entier gère pas mal de tableaux de 400000 éléments ( pour un dictionnaire ) je me suis dit : peut-être que l'espace mémoire n'est plus suffisant pour que " atof " puisse éxécuter ses calculs

    qu'en pensez-vous ? je suis perdu à vrai dire lol
    Je, ne le pense pas, à moins qu'il y ait un problème de pile...

    As-tu une option de contrôle de pile sur ton compilateur ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    Pixi-Pix j'affichais le résultat avec printf("%.10f",variable) ; ensuite je n'avais pas de fichier math.h dans mon programme donc je ne pense pas que ça pouvait venir de là ; et enfin je connnais juste les bases de GCC et donc je saurais incapable de dire si un contrôle de pile est présent ou non.

    Enfin bref j'ai trouvé la solution " en bidouillant " je m'explique si jamais ça peut servir à d'autres:

    le programme a été en partie fait avec GTK+ ( bibliothèque graphique ) et lorsqu'on utilise GTK+ il y a une fonction d'initialisation qui s'appelle :

    gtk_init()

    et lorsque j'appelai mon sous-programme se servant de " atof " l'appel était fait APRES le gtk_init() comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    int main(int argc,char **argv)
    {
    // Declaration variables
     
      gtk_init(&argc,&argv);
     
    // Code
     
      chargement_dictionnaire(); // programme appelant atof()
     
    // Code
     
    return 0;
    }

    Et là je ne saurais expliquer pourquoi il fallait inverser l'appel à chargement_dictionnaire et gtk_init soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    int main(int argc,char **argv)
    {
    // Declaration variables
     
      chargement_dictionnaire(); // programme appelant atof()
     
      gtk_init(&argc,&argv);
     
    // Code
     
     
    return 0;
    }
    Et là ça marche nickel, plus d'arrondi

    C'est peut-être du au fonctionnement de gtk_init qui n'est pas très explicite, enfin bref merci pour vos réponses le principal est que ça marche lol.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par NeMo_O
    C'est peut-être du au fonctionnement de gtk_init qui n'est pas très explicite,
    OK. C'est parce que gtk_init() modifie la localisation. Il faut lire la doc de GTK+ en détail...

  9. #9
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    même problème, pouvez-vous m'expliquer ? je ne peux pas changer l'emplacement de l'appelle à atof().

    J'ai testé les fonction g_atof(), g_strtod, g_ascii_strtod() mais pas mieux : je n'ai que la partie entière de mon double...


    Solution trouvée : il faut mettre un petit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	setlocale(LC_NUMERIC,"C");
    après l'initialisation de gtk. (fonction de locale.h).

    ça marche sous linux et windows.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction Replace pour quote
    Par piero53 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 17/11/2009, 01h19

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