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 (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!!:)
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].
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é.
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).
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>
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:
unsignedlong pow(unsignedlong x, unsignedlong n)
{
if(n == 0)
return1;
else
return x * pow(x, n - 1);
}
Oui, comme tu peux aussi utiliser l'exponentiation rapide... 'fin bon.
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.
(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é.
À 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.
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."
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.
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...
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).
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.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html