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 :

Problème fonction pow


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2019
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Problème fonction pow
    Bonjour lorsque je demande à l'utilisateur un nombre et que je veux afficher sa puissance au carré cela fonction très bien sauf pour lorsque la valeur entrée est 5. Dans ce cas là ça affiche que 5 au carré = 24.
    Je ne comprend pas où j'ai pu me tromper... j'utilise Code Blocks

    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        int valeur;
        printf("Saisir : ");
        scanf("%d",&valeur);
     
        int carre;
        carre=pow(valeur,2);
        printf("\ncela fait : %d",carre);
        return 0;
    }
    Voici ce que j'obtiens :
    Saisir : 5

    cela fait : 24
    Process returned 0 (0x0) execution time : 1.486 s
    Press any key to continue.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 598
    Points : 21 648
    Points
    21 648
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Chez-moi (Linux/gcc) ce code produit le bon résultat. Toutefois tu devrais lui inclure <math.h> pour que le compilateur connaisse la fonction pow() avant qu'elle soit appelée (sinon il la met "int" alors qu'elle est "double")

    Et bien entendu il faut compiler avec "-lm" (mais je suppose que c'est fait sinon tu n'aurais pas d'exécutable)
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2019
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Chez-moi (Linux/gcc) ce code produit le bon résultat. Toutefois tu devrais lui inclure <math.h> pour que le compilateur connaisse la fonction pow() avant qu'elle soit appelée (sinon il la met "int" alors qu'elle est "double")

    Et bien entendu il faut compiler avec "-lm" (mais je suppose que c'est fait sinon tu n'aurais pas d'exécutable)
    Merci de votre réponse, j'ai ajouter Cependant le problème persiste toujours, j'ai remarqué que j'ai ce problème sur tous les multiples de 5 lorsque je les mets au carré (ou une autre puissance) j'obtiens "le vrai résultat-1" ...
    Je vais essayer sous un autre environnement que Code blocks pour vérifier si ça ne vient pas de là le problème

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    février 2008
    Messages
    2 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : février 2008
    Messages : 2 091
    Points : 4 073
    Points
    4 073
    Billets dans le blog
    4
    Par défaut
    Bonjour.

    Je ne sais pas si ça va résoudre le problème mais pow(); renvoie un double. carre doit être du même type. Il en va de même pour les paramètres transmis.
    Utilisation de Glade avec Gtk+ - N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    mai 2016
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2016
    Messages : 305
    Points : 1 183
    Points
    1 183
    Par défaut
    Ca peut être une erreur d'arrondi qui produit cela.
    Suivant l'implémentation de la bibliothèque math, pow(x,y) peut calculer exp(y*ln(x)), même si y est un entier.
    Soit ici exp(2*ln(5))
    Comme ces fonctions 'exp' et 'ln' ne peuvent pas être calculées sans erreurs d'arrondis, la fonction peut retourner quelque chose comme 24.9999...
    Conversion en int -> 24
    Définir 'carre' en double et afficher en %lf

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 598
    Points : 21 648
    Points
    21 648
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Je ne sais pas si ça va résoudre le problème mais pow(); renvoie un double. carre doit être du même type. Il en va de même pour les paramètres transmis.
    Bien tenté mais malheureusement non. Tu as tout à fait le droit de passer un int là où on attend un double (ou l'inverse) et idem pour le retour. Le paramètre est alors transformé dans le type attendu (cast implicite). Et en plus, de int vers float/double ça le fait nickel (tandis que l'inverse perd la partie factionnelle)

    Citation Envoyé par wolinn Voir le message
    Ca peut être une erreur d'arrondi qui produit cela.
    Suivant l'implémentation de la bibliothèque math, pow(x,y) peut calculer exp(y*ln(x)), même si y est un entier.
    Soit ici exp(2*ln(5))
    Comme ces fonctions 'exp' et 'ln' ne peuvent pas être calculées sans erreurs d'arrondis, la fonction peut retourner quelque chose comme 24.9999...
    Conversion en int -> 24
    Jolie explication C'est vrai qu'on (moi le premier) a tendance à penser "puissance d'entiers" mais effectivement l'exposant est double ce qui permet des trucs comme 5.45^3.25 et que la seule façon de calculer ce genre d'opération est de passer par les logarithmes
    J'ai en effet tenté exp(log(5) * 2) et j'ai obtenu 24.99999996. Effectivement le cast en int supprime simplement ce qui se trouve après la virgule => 24
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2019
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par wolinn Voir le message
    Ca peut être une erreur d'arrondi qui produit cela.
    Suivant l'implémentation de la bibliothèque math, pow(x,y) peut calculer exp(y*ln(x)), même si y est un entier.
    Soit ici exp(2*ln(5))
    Comme ces fonctions 'exp' et 'ln' ne peuvent pas être calculées sans erreurs d'arrondis, la fonction peut retourner quelque chose comme 24.9999...
    Conversion en int -> 24
    Définir 'carre' en double et afficher en %lf
    J'ai passé le int en float et effectivement ça fonctionne, je ne savais pas que la puissance était calculée comme ça je pensais qu'on multipliait le nombre par lui même Y fois ( y étant la puissance).
    Je n'ai juste pas saisie ce que voulait dire "définir le carre en double" ou "l'exposant est double"
    Merci de vos réponses .

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 598
    Points : 21 648
    Points
    21 648
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Reborn1111 Voir le message
    J'ai passé le int en float et effectivement ça fonctionne, je ne savais pas que la puissance était calculée comme ça je pensais qu'on multipliait le nombre par lui même Y fois ( y étant la puissance).
    Et pour 2.5 puissance 3.14 tu fais comment ???

    Citation Envoyé par Reborn1111 Voir le message
    Je n'ai juste pas saisie ce que voulait dire "définir le carre en double" ou "l'exposant est double"
    Tu connais les types du C ? char, int, float, double ???
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2019
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et pour 2.5 puissance 3.14 tu fais comment ???
    ça fonctionne très bien avec 2.5 puissance 3.14, toutes les valeurs que je saisie sont en float et idem pour ce que j'obtiens


    Citation Envoyé par Sve@r Voir le message
    Tu connais les types du C ? char, int, float, double ???
    Je connais char,int et float mais pas double

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 598
    Points : 21 648
    Points
    21 648
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Reborn1111 Voir le message
    ça fonctionne très bien avec 2.5 puissance 3.14, toutes les valeurs que je saisie sont en float et idem pour ce que j'obtiens
    C'était suite à ton "je pensais qu'on multipliait le nombre par lui même Y fois". Donc la question complète (dont une grande partie était alors implicite) est celle-ci : "comment, avec ta façon de calculer X puissance Y, fais-tu pour calculer 2.5 puissance 3.14 ?"
    Et c'était évidemment une question réthorique juste pour te montrer les limites de ta méthode...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

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

Discussions similaires

  1. Problème fonction pow()
    Par OPSulaf dans le forum Langage
    Réponses: 2
    Dernier message: 13/02/2015, 18h08
  2. Problème avec la fonction pow
    Par marguerite99 dans le forum C
    Réponses: 13
    Dernier message: 14/11/2009, 15h25
  3. problème avec la fonction pow()
    Par emprex dans le forum C
    Réponses: 7
    Dernier message: 17/11/2007, 13h04
  4. probléme avec la fonction pow
    Par arglow dans le forum C
    Réponses: 7
    Dernier message: 23/07/2007, 14h38
  5. Problème avec la fonction pow(les puissance)
    Par Clément76 dans le forum C
    Réponses: 10
    Dernier message: 04/10/2006, 13h44

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