X puissance Y

Signaler
Messages postés
6
Date d'inscription
samedi 23 février 2002
Statut
Membre
Dernière intervention
16 février 2003
-
Messages postés
6
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2004
-
Quelle est la fonction qui permet d'élever un nombre X à la puissance Y ?

Merci.

14 réponses

Messages postés
131
Date d'inscription
vendredi 7 juin 2002
Statut
Membre
Dernière intervention
19 janvier 2004

Le plus simple, c'est d'inclure Math dans la clause use de l'unité, puis d'utiliser
Power(Base,Exposant);
Par exemple : 2 puissance 3 :
Nombre := Power(2,3);

A+ et Bonne Prog.
Messages postés
235
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
26 juillet 2010

Autre méthode : programmer la fonction :
Function puiss(x,y:integer):integer;
begin
if y=1 then puiss:=x else puiss:=x*puiss(x,y-1);
end;

Voila, il ya plus rapide si ca t'interesse en utilisant les puissances indiennnes, mais il faudrait que je reflechisse un peu plus. Dis moi si ca t'interesse.
Magicvinni
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Si y < 1, tu obtiens une exception EStackOverflow !

Il ne faut donc pas utiliser cette fonction tel quel.

De plus, que se passe-t-il en cas de dépassement de capacité ?

Avec deux Integer en entrée et une valeur de sortie également de type Integer, on atteint vite les limites...Un Longint permettrait déjà de repousser un peu ces limites.

May Delphi be with you
Messages postés
6
Date d'inscription
samedi 23 février 2002
Statut
Membre
Dernière intervention
16 février 2003

Merci pour ton aide !
Messages postés
6
Date d'inscription
samedi 23 février 2002
Statut
Membre
Dernière intervention
16 février 2003

Inutile d'aller plus loin dans tes recherches, la fonction que tu me propose est déjà très bien.
Par contre il faut que je prevoie le cas ou y=0 comme le suggère Delphiprog.

Merci.
Messages postés
962
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
1
Si je peux me permettre : à partir de Delphi 2 Integer et Longint sont identiques ( entiers 32 bits ), ceci ne changera donc pas la capacité de la fonction. A mon avis tu pensais plutôt à Int64.

--- :sleepy) Nono du Moulin :sleepy) ---
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Merci de me le rappeler. Ca vient sans doute du fait que j'ai longtemps utilisé Delphi 1 !
Effectivement, comme le type Int64 est un type entier 64 bits non signé, ça laisse de la marge.

Mais celà ne résout pas le problème de l'erreur de débordement de pile...

May Delphi be with you
Messages postés
235
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
26 juillet 2010

Honte à moi prof de math qui ai oublié le cas y=0 :blush)
MagicVinni
Messages postés
235
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
26 juillet 2010

Function puiss(x,y:int64):int64;
begin
if y=0 then puiss:=1 else puiss:=x*puiss(x,y-1);
end;
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Les maths et la récursivité sont deux choses indépendantes.
Ainsi, tu es totalement pardonné. :approve)

May Delphi be with you
Messages postés
6
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2004

mise à part de la fonction trivial que delphi propose dans sont unité Math:

function Puissance (x, y : Int64) : Int64;
var p : Int64;
begin
p:=x; result:=1;
while y > 0 do begin
if y mod = 1 then result := result * p;
p := sqr (p);
y := y div 2;
end;
end;

si y <= 0 Puissance retourne 1
Messages postés
6
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2004

function Puissance (x, y : Int64) : Int64;
var p : Int64;
begin
p:=x; result:=1;
while y > 0 do begin
if y mod 2=1 then result := result * p;
p := sqr (p);
y := y div 2;
end;
end;

remarque
y mod 2 <=> Odd (y)
Messages postés
6
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2004

j'avais oublié de donner une petite explication :

on prend la propriété suivante :
x^(2n) (x^n)^2 et x^(2n+1) x.(x^n)^2

donc avec la particularité de l'opérateur "div" on a :soit y 0 > x^y = 0
soit y paire => x^y = (x^(y div 2))^2
soit y impaire=> x^y = x.(x^(y div 2))^2
Messages postés
6
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2004

j'ai fait une erreur !il fallait lire "soit y 0> x^y = 1"