cs_bgK
Messages postés131Date d'inscriptionvendredi 7 juin 2002StatutMembreDernière intervention19 janvier 2004 25 oct. 2002 à 21:09
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);
magicvinni
Messages postés235Date d'inscriptionvendredi 25 avril 2003StatutMembreDernière intervention26 juillet 2010 26 oct. 2002 à 09:14
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
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 26 oct. 2002 à 09:42
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.
cs_DAR
Messages postés6Date d'inscriptionsamedi 23 février 2002StatutMembreDernière intervention16 février 2003 26 oct. 2002 à 10:01
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.
cs_Nono40
Messages postés962Date d'inscriptionmercredi 3 avril 2002StatutMembreDernière intervention12 septembre 20062 26 oct. 2002 à 12:37
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.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 26 oct. 2002 à 14:18
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...
munstef
Messages postés6Date d'inscriptionlundi 20 décembre 2004StatutMembreDernière intervention20 décembre 2004 20 déc. 2004 à 11:35
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;
munstef
Messages postés6Date d'inscriptionlundi 20 décembre 2004StatutMembreDernière intervention20 décembre 2004 20 déc. 2004 à 11:39
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;
munstef
Messages postés6Date d'inscriptionlundi 20 décembre 2004StatutMembreDernière intervention20 décembre 2004 21 déc. 2004 à 22:08
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