trenta3 (Normal User)
Newbie
Messaggi: 16
Iscritto: 17/12/2008
|
Mi spiego subito.
Vorrei un ciclo che mi elevasse a potenza un numero double a esponente double.
So che già esiste la funzione pow() della libreria <math.h> ma vorrei un ciclo da mettere nel mio programma in modo da non appesantirlo troppo.
Per adesso, cercando con Google ho trovato solo cicli di elevamento a potenza con variabili intere.
Posto qui sotto il codice che ho provato a fare:
Codice sorgente - presumibilmente C# |
double potenza(double base, double esp){ double i, ris; ris = 1; i = 1; while(i<=esp) { ris = ris * base; ++i; } return (ris); }
|
Il problema è che questocodice ritorna sempre 1. Credo che sia per colpa dell' i++
Aspetto con ansia le vostre risposte.
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Non puoi utilizzare questo metodo per calcolare
x elevato a y
se l'esponente y e' REALE.
Quel metodo vale SOLAMENTE se l'esponente e' INTERO.
Nel caso di valori reali dell'esponente, la potenza e' definita come
"estremo superiore della successione x elevato a y-ennesimo"
e i metodi di calcolo sono diversi ...
Ti consiglio di dare un'occhiata alle
"potenze con esponente reale"
su un libro o una guida di matematica.
|
|
trenta3 (Normal User)
Newbie
Messaggi: 16
Iscritto: 17/12/2008
|
Grazie, sono andato a leggere qui(http://www.arrigoamadori.com/lezioni/TutorialMatematica/Fu ... ed ho provato a scrivere questo codice:
La funzione power è quella a cui si passa la potenza, le altre sono quelle che chiama.
Ho provato ad eseguirlo ma mi dà come risultato 1.#INF00
Codice sorgente - presumibilmente C# |
double power(double base, double esp){ double a, ris; int c; long int b, d; a = esp; b = (long int)esp; while ((b>a) or(b<a)){ a = a * 10; c = c + 1; b = (long int)a; } d = potenza(10, c); ris = Sqrt2(pot(base,b),d); return (ris); } double Sqrt(int n,int x){ double h=n/x; int i; for(i=0;i < NUM_CICLI ;i++){ h = (h+(n/h))/x; } return h; } long int potenza(int base, int esp){ long int i, ris; ris = 1; i = 1; while(i<=esp) { ris = ris * base; ++i; } return (ris); } double Sqrt2(long double n,long int x){ double h=n/x; int i; for(i=0;i < NUM_CICLI ;i++){ h = (h+(n/h))/x; } return h; } long double pot(double base, int esp){ long double ris; int i; ris = 1; i = 1; while(i<=esp) { ris = ris * base; ++i; } return (ris); }
|
Sono disperato perchè ho scritto tantissimo.
Perfavore, aiutatemi!
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Scusa ... ma quale metodo hai seguito?
In quella pagina si parla solo di funzione esponenziale non di potenza ...
|
|
trenta3 (Normal User)
Newbie
Messaggi: 16
Iscritto: 17/12/2008
|
Ho seguito la parte che dice:
.-.-.-.-.
Procediamo allora costruendo questa successione :
In questo modo ci avviciniamo sempre di più al valore cercato .
Ma i numeri decimali agli esponenti sono numeri razionali (con un numero finito di decimali o con un numero infinito di decimali periodici), cioè esprimibili come frazioni di numeri interi. Possiamo allora scrivere :
.
Passando ora alle radici, otteniamo la successione :
.
Questa successione, procedendo in questo modo all'infinito, tenderà al numero .
Le formule presentate in questo paragrafo ci permettono, in conclusione, di eseguire operazioni con le potenze e calcolare potenze con qualunque esponente reale (razionale o irrazionale).
._._._._._._._.
Ho pensato quindi di trasformare l'esponente in frazione e metterla sotto radice quadrata dopo aver elevato a potenza la base per il numeratore della frazione per poterlo calcolare.
Credo che questo sia il metodo giusto.
Vi prego aiutatemi!!!!!!!!!!!!!
|
|
trenta3 (Normal User)
Newbie
Messaggi: 16
Iscritto: 17/12/2008
|
Grazie a tutti, ho già rimediato:
Sono andato nell'header Math.h e ho preso le funzioni inerenti a pow(), ora il programma và alla perfezione.
Grazie a tutti!
|
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
In effetti, avevo capito che tu volessi scrivere il codice che implementasse un algoritmo di calcolo della potenza.
Se avessi chiesto come calcolare la potenza con la libreria standard del C, ti avrei suggerito immediatamente la pow ...
Per maggiori informazioni sulla pow (e altro)
http://www.cplusplus.com/reference/clibrary/cmath/pow.html
|
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Postato originariamente da HeDo:
|
beh in effetti non e' cosi' che si risolvono i problemi...
comunque, se puo' servire, basta ricordarsi che:
a^b = e^(b*ln(a)) per ogni a e b con a > 0
ciao. |
|