Oppure

Loading
10/06/05 8:49
Zizzius
Qualcuno mi sa gentilmente dire il listato di una funzione che riceva come argomenti la base e l'esponente reali (real) e restituisca il risultato (real)?

O se pu? essere pi? semplice, una funzione che calcoli la radice n-esima (con n intero) di un valore intero.

Grazie.
aaa
10/06/05 20:43
radio
PRESO DA di.unito.it/~coppo/DIDATTICA/SIS/Lez5/…

non ci ho capito molto ma funziona...

//Elevazione a potenza "veloce" (ricorsiva)

Function Potenza(a:real;n:integer):real;
var t:real;
begin
if (n=0)
then Potenza:=1
else if ((n mod 2) = 0)
then
begin
t:= Potenza(a, n div 2);
Potenza := t*t;
end
else Potenza := a * Potenza(a, n-1);
end;

var x:real; n:integer;

begin
Write('Valore da elevare a potenza? ');
Readln(x);
Write('Esponente? ');
Readln(n);
Writeln('x^n vale: ', Potenza(x, n));
Readln;
end.

{Il programma si basa sull'osservazione che una possibile definizione
dell'esponenziale e'
exp(x,n) = 1 se n=0
exp(x, n div 2)^2 se n>0 e' pari
x*exp(x, n-1) se n>0 e' dispari
dove "div" e' il quoziente della divisione intera (primitiva PASCAL).
Adesso si noti che per un dato n si fanno al piu' due moltiplicazioni,
una per moltiplicare x per exp(x, n-1) e una per elevare exp(x, n div 2) al
quadrato) e ci si riduce a calcolare exp(x, n div 2). Quindi il numero totale di
moltiplicazioni (che sono anche qui proporzionali al tempo di esecuzione della
funzione) e' al piu 2 per il mumero di volte che posso dividere n per due (con
la divisione intera). Ma questo numero e' coirca log2 n (logaritmo in base 2
di n). Quindi il nuero totale di moltiplicazioni per calcolare x^n e' al piu'
2 * log2 n (in notazioine O si dice che questa versione di Potenza e' O(log n)).
Per esempio per x=1.000001 e n = 1000000000 il numero di moltiplicazioni da fare
e' al piu' 60. Questo elimina tutti i problemi di prima, ed e' la ragione per
cui questa versione dell'esponenziale e' detta "veloce".

Anche questa funzione, come tutte, si puo' fare in forma iterativa. Una
possibile versione e' la seguente:

Function Potenza(a:real;n:integer):real;
var k:integer;
var x, ris:real;
begin
k:=1;
x:=a;
ris:=1;
while (k<=n) do
begin
if (((n div k) mod 2) = 1)
then ris:=ris*x;
x:=x*x;
k:=k*2;
end;
Potenza := ris;
end;

Pur essendo del tutto equivalente alla versione ricorsiva questa funzione e'
molto piu' difficle da capire.... }


alla fine questo programma mi funzionava
//Eleva ala potenza n-esima con n appartenente a N un numero reale

program radio;
// uses wincrt;
var a:real;b:integer;

Function Potenza(a:real;n:integer):real;
 var
 	k:integer;
 	x,
 	ris:real; // per il risultato
 
Begin
  k:=1;
  x:=a;
  ris:=1;
   While (k<=n) Do			// ripete il ciclo n-volte
       Begin
        If (((n Div k) Mod 2) = 1)
             Then ris:=ris*x;
         x:=x*x;
         k:=k*2;
       End;
  Potenza := ris;
End;

Begin
WriteLn('Inserisci a');
  ReadLn(a);
WriteLn('Inserisci b');
  ReadLn(b);
WriteLn(Potenza(a,b):0:5);
End.

aaa