Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Potenza a esponente reale
Forum - Pascal - Potenza a esponente reale

Avatar
Zizzius (Honoris User)
Guru


Messaggi: 675
Iscritto: 28/02/2005

Segnala al moderatore
Postato alle 10:49
Venerdė, 10/06/2005
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.

PM Quote
Avatar
radio (Ex-Member)
Expert


Messaggi: 327
Iscritto: 03/03/2005

Segnala al moderatore
Postato alle 22:43
Venerdė, 10/06/2005
PRESO DA http://www.di.unito.it/~coppo/DIDATTICA/SIS/Lez5/EXP_VEL.PAS

non ci ho capito molto ma funziona...

Testo quotato

//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
Codice sorgente - presumibilmente Delphi

  1. //Eleva ala potenza n-esima con n appartenente a N un numero reale
  2.  
  3. program radio;
  4. // uses wincrt;
  5. var a:real;b:integer;
  6.  
  7. Function Potenza(a:real;n:integer):real;
  8.  var
  9.         k:integer;
  10.         x,
  11.         ris:real; // per il risultato
  12.  
  13. Begin
  14.   k:=1;
  15.   x:=a;
  16.   ris:=1;
  17.    While (k<=n) Do                      // ripete il ciclo n-volte
  18.        Begin
  19.         If (((n Div k) Mod 2) = 1)
  20.              Then ris:=ris*x;
  21.          x:=x*x;
  22.          k:=k*2;
  23.        End;
  24.   Potenza := ris;
  25. End;
  26.  
  27. Begin
  28. WriteLn('Inserisci a');
  29.   ReadLn(a);
  30. WriteLn('Inserisci b');
  31.   ReadLn(b);
  32. WriteLn(Potenza(a,b):0:5);
  33. End.


PM Quote