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 :

la fonction puissance pow() ? entier, réel ?


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut la fonction puissance pow() ? entier, réel ?
    Bonjour,

    J'ai une petite question concernant la fonction puissance pow :

    Lorsque je mets ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d", pow(2,7));
    J'obtiens 0

    et lorsque je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%f", pow(2,7));
    J'obtiens bien 128,000000.

    Mais pourtant 2 à la puissance 7 = 128 et 128 c'est bien un entier, je ne comprends donc pas pourquoi ca passe pas avec %d ??

    Quelqu'un peut m'expliquer svp ?

    Merci Bonne journée

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Quand tu regardes le prototype de la fonction pow tu trouves :

    double pow (double, double);

    Donc cette fonction renvoie un double qui est un type flottant c'est pour ça que ton printf ne marche pas. Remarque au passage que les arguments aussi sont des double mais que la conversion est automatique.

    Corrigez moi si je me trompe.

    Sliya

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Si tu compiles avec -Wall -W, tu verras qu'il y aura un warning dans ton premier appel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c: In function `main':
    main.c:7: warning: int format, double arg (arg 2)
    Essaye ça, il n'y aura plus de warning et ça marchera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	printf("%d", (int) pow(2,7));
    Je ne répondrai à aucune question technique en privé

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par millie
    Si tu compiles avec -Wall -W, tu verras qu'il y aura un warning dans ton premier appel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c: In function `main':
    main.c:7: warning: int format, double arg (arg 2)
    Essaye ça, il n'y aura plus de warning et ça marchera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	printf("%d", (int) pow(2,7));
    Pourquoi faire un cast ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	printf("%.0f", pow(2,7));
    Jc

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par fearyourself
    Pourquoi faire un cast ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	printf("%.0f", pow(2,7));
    Jc
    Car il tenait à utiliser %d.
    Je ne répondrai à aucune question technique en privé

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par millie
    Car il tenait à utiliser %d.
    Je ne suis pas d'accord, il demandait pourquoi cela ne s'affichait pas correctement en entier. La réponse a été donnée :

    C'est un flottant il faut donc le traiter comme tel. Mais si on veut un affichage de la partie réelle, un cast est inutile puisque l'utilisation de "%.0f" le permet.

    Jc

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par fearyourself
    Mais si on veut un affichage de la partie réelle, un cast est inutile puisque l'utilisation de "%.0f" le permet.
    Pour ma part, je trouve plus lisible la version avec le cast explicite.

    Et le résultat diffère selon les valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        double f=128.49;
        printf("en %%f = %f\n",f);
        printf("en %%.0f = %.0f\n",f);
        printf("en %%d = %d\n",(int)f);
     
        printf("\n");
     
        f=128.5;
        printf("en %%f = %f\n",f);
        printf("en %%.0f = %.0f\n",f);
        printf("en %%d = %d\n",(int)f);
    donne pour résultat (sur Windows, avec mingw, idem avec visual C++)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    en %f = 128.490000
    en %.0f = 128
    en %d = 128
     
    en %f = 128.500000
    en %.0f = 129
    en %d = 128
    donc, le printf d'un flottant avec %.0f correspond à un arrondit, avec basule de l'entier renvoyé à partie décimale >= .5

    Comme toujours, il faut beaucoup de méfier des problèmes de conversion.

    Au moins, en faisant explicitement le cast, on sait où on va : plus proche valeur entière arrondie vers zéro (ce n'est pas la partie entière au sens mathématique).
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  8. #8
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 75
    Points : 62
    Points
    62
    Par défaut
    La reponse a ete dejà donnée, pow renvoie un floattant donc tu dois utiliser printf comme ceci : printf("%f",...);

  9. #9
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Ok merci mais c'est quoi un cast ?
    C'est quand on met (int) devant pour forcer la conversion du résultat de float en int ?
    C'est pas bien de l'utiliser ?


    Merci
    Bonne journée

  10. #10
    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 italiasky
    Ok merci mais c'est quoi un cast ?
    C'est quand on met (int) devant pour forcer la conversion du résultat de float en int ?
    Oui.
    C'est pas bien de l'utiliser ?
    En général, c'est mal. Mais ça dépend des cas. C'est parfois utile voire obligatoire.

    Il est Très Mal d'utiliser un cast pour masquer un warning si on ne sait pas exactement ce qu'on fait.
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. type entier, réel en C
    Par italiasky dans le forum C
    Réponses: 3
    Dernier message: 02/01/2007, 22h31
  2. fonction math : pow()
    Par uriotcea dans le forum C++Builder
    Réponses: 12
    Dernier message: 05/10/2006, 11h05
  3. Fonction Puissance en J2ME
    Par Vince1404 dans le forum Java ME
    Réponses: 4
    Dernier message: 22/08/2006, 16h28
  4. 8x11=0 !! problème fonction puissance
    Par Renesis57 dans le forum C
    Réponses: 18
    Dernier message: 26/11/2005, 14h54
  5. [LG]fonction puissance en pascal
    Par le 27 dans le forum Langage
    Réponses: 8
    Dernier message: 13/12/2003, 23h21

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