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

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    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 régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    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 du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

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

  4. #4
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    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..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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.
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 ?
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Points : 116
    Points
    116
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Débutant 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
    Points : 162
    Points
    162
    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