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 :

paramétrer une impression de double sur un printf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut paramétrer une impression de double sur un printf
    Bonjour

    Je cherche à charger une chaine avec la valeur d'un double.
    Première tentative du débutant que je suis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    F64Valeur = 0.00002369;
    sprintf(Ligne,"valeur = %lf\n",F64Valeur);
    et j'obtiens
    valeur = 0.000024
    il y a eu un arrondi au 6ieme chiffre significatif

    j'ai réussi à faire un peu mieux avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    F64Valeur = 0.00002369;
    sprintf(Ligne,"valeur = %0.15lf\n",F64Valeur);
    et j'obtiens
    valeur = 0.000023690000000
    Mais
    1) comment virer tous ces 0 à la fin qui pénalisent la lecture ?
    2) et si la valeur n'a pas 15 mais 16 chiffres significatifs, par exemple F64Valeur = 0.000000000000002369; ?

    Je n'ai pas réussi à trouver d'autres moyens de formater les %f, y en a t-il ?

    Merci

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 258
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double essai=0.00002369;
    printf("double %.8f\n",essai);
    Va t'afficher avec 8 chiffres après la virgule. Par défaut, printf doit afficher 6 chiffres après la virgule et fait donc un arrondi.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Tu ne peux pas dire d'afficher autant de décimales que possibles, mais pas les 0 finaux.
    Par contre, tu peux modifier la string pour la raccourcir.

    Par exemple ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    F64Valeur = 0.00002369;
    sprintf(Ligne,"valeur = %0.15lf\n",F64Valeur);
     
    char* p = Ligne+27;
    while(p>Ligne && *p=='0') --p;
     
    if (*(p+1) == '0') *(p+1) = '\0';

  4. #4
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    Bonjour

    merci pour vos réponses

    Là j'ai donné une valeur constant à F64valeur mais on est bien d'accord que ce n'est jamais la même valeur qui est à imprimer.

    Donc il faut que
    1) j'estime le nombre de chiffre significatifs que je peux avoir besoin dans le pire des cas dans mon appli, par exemple %0.25lf (soyons fou mais j'essaierai de l'être un peu moins)
    2) une fois le sprintf exécuté pour remplir "Ligne" je passe "Ligne" à la moulinette pour enlever les 0 en trop à la fin ?

    merci

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 768
    Par défaut
    En lisant la documentation sur le format printf, on s’aperçoit qu'il y a le format "%.*lf" avec lequel on peut spécifier la précision en paramètre.

    Donc avec une succession de multiplication de 10, on peut trouver la place du dernier chiffre

    Exemple non testé, non compilé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        unsigned char last_index = 0;
        double float_value = F64valeur;
        int last_decimal;
     
        for(unsigned char index = 0; index < XX; ++index) {
            float_value *= 10.0;
            last_decimal = ((int) float_value - (int) (((int) float_value) * 10));
     
            if (last_decimal != 0) { last_index = index ; }
        }
    Il faut regarder la norme pour remplacer XX

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 258
    Par défaut
    Je prendrais plutôt la proposition de leternel de modifier la chaine plutôt que de faire une boucle avec des multiplications.
    Donc il faut que
    1) j'estime le nombre de chiffre significatifs que je peux avoir besoin dans le pire des cas dans mon appli
    Pas besoin, tu utilises par exemple %.16f, puis tu vires les 0 excessifs de la chaine avec par exemple un strcspn
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    Bon j'ai fait des tests avec 0.15 et 0.50 et en fait ca ne fait pas trembler mon petit cortexM0+.. alors je vais partir sur la solution où je sprintf avec une précision de 50 et après je repositionne la fin de chaine.

    Par contre j'ai beau le tourner dans tous les sens mon niveau en C ne me permet pas de comprendre ce code :
    Citation Envoyé par leternel Voir le message
    Tu ne peux pas dire d'afficher autant de décimales que possibles, mais pas les 0 finaux.
    Par contre, tu peux modifier la string pour la raccourcir.

    Par exemple ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    F64Valeur = 0.00002369;
    sprintf(Ligne,"valeur = %0.15lf\n",F64Valeur);
     
    char* p = Ligne+27;
    while(p>Ligne && *p=='0') --p;
     
    if (*(p+1) == '0') *(p+1) = '\0';
    Serait il possible de l'avoir en français pour que je puisse essayer de comprendre les syntaxes ?

    Merci

  8. #8
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    Est ce que par hasard ca ne voudrait pas dire

    char* p = Ligne+27; => initialisation d'un pointeur à la fin de la chaine
    while(p>Ligne && *p=='0') --p; => en partant de la fin de la chaine et tant que l'on a un 0 on remonte la chaine

    if (*(p+1) == '0') *(p+1) = '\0'; => là je comprends toujours pas


    ne peut il pas être remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* p = Ligne + strlen(Ligne) -1
    ? parce que ce ne sera pas toujours 27 dans mon cas.

    Merci encore

Discussions similaires

  1. Stopper une impression sur Windows NT Pro ?
    Par coralie26 dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 29/09/2007, 17h32
  2. Impression d'étiquettes sur une Dymo LabelWriter 400
    Par robun dans le forum VBA Access
    Réponses: 3
    Dernier message: 29/08/2007, 07h43
  3. Réponses: 21
    Dernier message: 11/06/2007, 09h30
  4. Réponses: 2
    Dernier message: 22/01/2007, 20h06
  5. Parametrer le nombre d'index sur une table
    Par Invité dans le forum Access
    Réponses: 1
    Dernier message: 17/05/2006, 11h36

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