Partage
  • Partager sur Facebook
  • Partager sur Twitter

Elever un nombre à une puissance...

L'histoire d'un matheux qui débutait en C

    3 décembre 2005 à 14:00:25

    Bonjour tout le monde!!
    Je debute en C, j'ai juste le niveau des cours de mateo, mais en essayant des ptits trucs moi meme par analogie au php j'ai réussi a comprendre comment on fait des conditions et des boucles :lol: (ouais!!)
    Bon, bref, à peine je débute, j'ai besoin d'un truc que personne n'utilise jamais: elever un nombre à la puissance....
    j'ai deux trois variables: nombe exposant et resultat
    Je veut que resultat valle nombre puissance exposant (vous me suivez ? :D)
    Pour l'insyant je fait comme ca:

    int resultat=1;
    for (a=1;a<=exposant;a++)
    {
    resultat=resultat*nombre
    }

    Ma question: Y a-t-il une fonction toute faite?? Le "^" semble etre l'operateur ou exclusif, comme en php...
    merci beaucoup!!:)
    • Partager sur Facebook
    • Partager sur Twitter
      3 décembre 2005 à 14:01:43

      oui, c'est la fonction pow, situé dans math.h
      • Partager sur Facebook
      • Partager sur Twitter
        7 octobre 2007 à 15:51:07

        oui, math.h est ton ami :)

        Si tu veux, regarde mon tuto (cf ma signature) §A.
        J'ai un exemple simple qui montre quelques fonctions de math.h :)
        • Partager sur Facebook
        • Partager sur Twitter

        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          7 octobre 2007 à 16:05:27

          Citation : Fvirtman

          oui, math.h est ton ami :)



          Qu'est ce qui garantit l'exactitude du résultat si on calcule des puissances entières (pow() retourne un double), il serait fâcheux que pow(2,3) ait pour valeur 7.9999999999999999999999999 qui va être converti en 7.

          [Je pose juste la question, je ne me suis jamais penché sur la question des nombres réels en C, je crois que c'est une question plus complexe qu'il n'y paraît].

          EDIT orthographe
          • Partager sur Facebook
          • Partager sur Twitter
            7 octobre 2007 à 19:02:33

            Candide pourquoi pow(2,3) serais égal à 7,9999999999999999 ?
            • Partager sur Facebook
            • Partager sur Twitter
              7 octobre 2007 à 20:12:53

              en parlant de pow, gcc me renvoie "undefined reference to pow"... (j'ai bien inclus "#include <math.h>")
              excusez moi si je squate
              • Partager sur Facebook
              • Partager sur Twitter
                7 octobre 2007 à 20:15:56

                Pas faux : si ton but est de faire des "puissances entieres", le mieux est de se reprogrammer une petite fonction dans laquelle tu auras, finalement, juste un for.

                7.9999999 car le codage des double n'est pas exact : un double est toujours une approximation (très proche de la réalité) d'un résultat recherché.
                • Partager sur Facebook
                • Partager sur Twitter

                Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                  7 octobre 2007 à 21:44:48

                  Citation : next2

                  Candide pourquoi pow(2,3) serais égal à 7,9999999999999999 ?


                  cf. réponse de Fvirtman. En faisant une recherche sur le forum usenet fclc, j'ai lu qu'effectivement c'est une pratique non recommandée que de calculer des puissances entières avec la fonction pow() (pour ceux que ça intéresse, référence ici).

                  Citation : Lumin0u

                  en parlant de pow, gcc me renvoie "undefined reference to pow"... (j'ai bien inclus "#include <math.h>")


                  À mon avis, c'est un problème de link (sous gcc, il faut compiler avec l'option -lm pour lier avec la bibliothèque mathématique).

                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 octobre 2007 à 22:15:58

                    j'essaierais, en attendant j'en ai fait une vu que j'étais pas trop exigeant, merci
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 octobre 2007 à 22:20:39

                      Pour coder une fonction pow utilisant uniquement les puissances entières, tu peux partir de ça aussi (au lieu d'utiliser un for) :
                      <math>\(x%5E0%20%3D%201\)</math>
                      <math>\(x%5En%20%3D%20x%20%5Ctimes%20x%5E%7Bn%20-%201%7D\)</math>

                      On a donc en C:
                      1. unsigned long pow(unsigned long x, unsigned long n)
                      2. {
                      3.     if(n == 0)
                      4.         return 1;
                      5.     else
                      6.         return x * pow(x, n - 1);
                      7. }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 octobre 2007 à 22:30:08

                        Citation : delroth


                        1. unsigned long pow(unsigned long x, unsigned long n)
                        2. {
                        3.     if(n == 0)
                        4.         return 1;
                        5.     else
                        6.         return x * pow(x, n - 1);
                        7. }


                        ou pourquoi faire simple quand on peut faire compliqué ... ;)

                        [sinon, la lecture du zcode de ton message m'a appris qu'on pouvait utiliser des exposants mathématiques sur le forum, ce qui va m'être utile.]
                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 octobre 2007 à 22:35:09

                          Citation : delroth

                          Pour coder une fonction pow utilisant uniquement les puissances entières, tu peux partir de ça aussi (au lieu d'utiliser un for) :
                          <math>\(x%5E0%20%3D%201\)</math>
                          <math>\(x%5En%20%3D%20x%20%5Ctimes%20x%5E%7Bn%20-%201%7D\)</math>

                          On a donc en C:

                          1. unsigned long pow(unsigned long x, unsigned long n)
                          2. {
                          3.     if(n == 0)
                          4.         return 1;
                          5.     else
                          6.         return x * pow(x, n - 1);
                          7. }

                          Oui, comme tu peux aussi utiliser l'exponentiation rapide... 'fin bon.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 octobre 2007 à 16:14:21

                            Euh, moi ? oui, m'enfin, c'était juste pour dire que dans la lignée "faire plus compliqué", on pouvait faire "mieux" aussi, tant qu'à faire. :-° Non parce que coder l'exponentiation normale en récursif en C. :D
                            • Partager sur Facebook
                            • Partager sur Twitter
                              8 octobre 2007 à 18:51:51

                              (dsl encore un squattage de post) je me demandais combien de niveau de recursivité on avait en C?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 octobre 2007 à 19:09:56

                                Citation : Maeredhel

                                (dsl encore un squattage de post) je me demandais combien de niveau de recursivité on avait en C?


                                C'est pas une question de langage mais de système et d'application. Il y a un 'certain nombre' de niveaux possibles (ça peut être 0) et on ne sait pas si on a atteint la limite. Dans l'absolu, un appel récursif invoque un comportement indéterminé.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Music only !
                                  8 octobre 2007 à 19:19:07

                                  À ma connaissance, ce n'est pas spécifié par la norme, cela dépend de ton système, et en général, cela se configure. sh(1) a un builtin ulimit souvent qui permet de changer la taille de la pile ulimit -s.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    8 octobre 2007 à 19:22:22

                                    Citation : Maeredhel

                                    (dsl encore un squattage de post) je me demandais combien de niveau de recursivité on avait en C?



                                    Il n'y a pas de raison que le langage définisse ça. C'est plutôt une question de taille de la pile à mon avis.

                                    Citation : -ed-

                                    Dans l'absolu, un appel récursif invoque un comportement indéterminé.


                                    Comprends pas pourquoi (oui, à cause du zéro appel récursif possible ?)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      8 octobre 2007 à 19:45:39

                                      Si c'était indéfini, alors tout appel de fonction serait indéfini, car si un appel de fonction au moins est possible, alors, il peut être récursif, d'après la norme, § 6.5.2.2.11 :

                                      "Recursive function calls shall be permitted, both directly and indirectly through any chain
                                      of other functions."
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        8 octobre 2007 à 19:51:36

                                        Citation : rz0

                                        Si c'était indéfini, alors tout appel de fonction serait indéfini, car si un appel de fonction au moins est possible, alors, il peut être récursif, d'après la norme, § 6.5.2.2.11 :

                                        "Recursive function calls shall be permitted, both directly and indirectly through any chain
                                        of other functions."


                                        Je ne sais pas si c'est à moi que tu t'adresses. Le posteur a parlé de définir le niveau de récursivité, pas la possibilité de la récursivité en C.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          8 octobre 2007 à 19:55:17

                                          Je m'adressais à toi en effet, et à -ed- aussi, sur le fait qu'il dise qu'a priori, un seul appel récursif provoque un UB. Je montre juste que si aucun appel récursif est possible, alors aucun appel de fonction est possible, ce qui serait assez stupide de la part de l'implantation...
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            8 octobre 2007 à 23:18:30

                                            Citation : rz0

                                            Je m'adressais à toi en effet, et à -ed- aussi, sur le fait qu'il dise qu'a priori, un seul appel récursif provoque un UB. Je montre juste que si aucun appel récursif est possible, alors aucun appel de fonction est possible, ce qui serait assez stupide de la part de l'implantation...


                                            Tu as raison. Mais ce que je veux dire, c'est ue le langage C ne garanti pas le nombre d'appel imbriqués, qu'il soit récursif ou non. Je suis d'accord pour dire que, dans l'absolu (j'insiste), appeler une fonction invoque un comportement indéfini, de même que de créer une variable locale.

                                            En fait tout repose sur le système. Il m'est arrivé de ne pas pouvoir appeler sprintf() dans du code de boot pendant un moment où la pile faisait dans les 200 bytes (boot de MC68302, test de la mémoire externe).

                                            Si on sait que la pile fait dans les 2ko, 100ko, ou 2Mo, c'est pas pareil. mais c'est toujours une ressource très limitée (beaucoup plus que la mémoire allouée).

                                            Il y a une pile (stack) par tâche (thread) alors qu'il y a un tas (heap) par processus (process) (voire pour tout le système).
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Music only !

                                            Elever un nombre à une puissance...

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                            • Editeur
                                            • Markdown