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 :

Fonction pow de la lib math.h


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut Fonction pow de la lib math.h
    Bonjour,

    J'ai un léger souci avec la fonction pow de la lib math.h :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdio.h>
    #include <windows.h>
    #include <math.h>
     
    unsigned int ConvertOneIntCharToItsValue(char c)
    {
      return c - '0';
    }
     
    unsigned int ConvertCharNumberStringToInteger(char s[])
    {
      size_t count = 0;
      int nbr_pow = strlen(s)-1;
      unsigned int Res = 0;
     
      while (count < strlen(s))
        Res += ConvertOneIntCharToItsValue(s[count++])*((int)pow(10, nbr_pow--));
     
      return (Res);
    }
    int main ()
    {
        printf("%d\n", ConvertCharNumberStringToInteger("12000"));
        return(0);
    }
    Le but est de convertir un string de type char, ne contenant que des chiffres au nombre que forment l'ensemble des chiffres.
    Seulement, pour toutes les puissances paires, je n'obtiens pas le bon résultat.

    Par exemple, pour pow(10, 2), il m'affiche 99 au lieu de 100.

    J'ai testé en dehors de la fonction, j'obtiens bien 100, mais dans ma boucle while, j'obtiens toujours -1 par rapport au résulat attendu pour les puissances de 2, soit 99 au lieu de 100, 9999 au lieu de 10000 etc.

    Sauriez-vous pourquoi ?

    Merci par avance.

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    La fonction pow renvoie un double. Un double est un type flottant approximatif, ce qui fait que tu peux avoir des nombres arrondis.

    Enfin tu emploies plein de calculs inutiles (calcul de la longueur de la chaîne, utilisation de pow, beaucoup de variables).
    Ce ne serait pas plus simple de prendre ton nombre, lui ajouter s[count++] et ensuite le multiplier par 10 ?

    J'ai modifié ton programme, ta fonction tient en quelques lignes et une seule variable

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Salut,

    Merci pour ta réponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double my_pow(unsigned int a, unsigned int b)
    {
      size_t count = 0;
      double res = 1;
     
      while (count < b--)
       res *= a;
      return (res);
    }
    En utilisant ma fonction, mon code ci-dessus marche sans souci.

    Concernant la complexité inutile du code, je veux bien le croire, je débute et j'ai encore du mal à aller à l'essentiel.


  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Tu fonctionnes avec des unsigned int donc pourquoi utiliser des double dans ta fonction my_pow ? Des simples unsigned int suffisent

    Je t'explique rapidos le principe :

    Tu as une chaîne de caractère "1234" que tu vas parcourir dans le sens de lecture (de gauche à droite).
    Donc tu sais que tu vas toujours commencer avec les nombres "de poids fort" et finir par les nombres "de poids faible".
    En partant de ça c'est très simple !
    Tu initialises un nombre à 0.
    Tu lis ton premier caractère (auquel tu enlèves '0') et tu l'ajoutes à ton nombre. (tu as 1)
    Ensuite, tu as un autre nombre -> Tu multiplies ton nombre par 10 (donc tu as 10)
    Tu ajoutes ce nombre -> 12
    Tu multiplies par 10 -> 120
    Tu ajoutes 3 -> 123
    Tu multiplies par 10 -> 1230
    Tu ajoutes 4 -> 1234
    Ta chaîne est finie, on arrête là et on renvoie le nombre.

    Et voilà tu t'es passé des appels à pow, strlen et ut as économisé des variables

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Ah oué, vu comme ça, c'est encore plus simple

    Je suis bien d'accord qu'actuellement, mon plus gros souci, c'est d'être le plus concis possible. J'ai tendance à me compliquer inutilement.

    Merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/10/2007, 09h37
  2. int, unsigned int, et la fonction pow
    Par salseropom dans le forum C
    Réponses: 11
    Dernier message: 22/12/2006, 17h53
  3. [Math.h] la fonction 'pow'
    Par fantomasmusic dans le forum C
    Réponses: 3
    Dernier message: 16/10/2006, 13h00
  4. Problème avec la fonction pow(les puissance)
    Par Clément76 dans le forum C
    Réponses: 10
    Dernier message: 04/10/2006, 12h44
  5. Fonctions inlines et fichiers .lib
    Par michhh dans le forum C++
    Réponses: 3
    Dernier message: 05/07/2005, 03h09

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