Trusted (Normal User)
Newbie
Messaggi: 14
Iscritto: 06/09/2015
|
Ciao a tutti Boys!
Sto studiando il C e sono arrivato alla parte delle funzioni.
Sto svolgendo un esercizio che richiede di calcolare la potenza di un numero senza usare librerie matematiche.
Ecco il codice:
Codice sorgente - presumibilmente C# |
#include <stdio.h> long integerPower( long base, long exponent); /*PROTOTIPO FUNZIONE*/ int main (void) { long base; /*Base*/ long exponent; /*Esponente*/ long result; /*Risultato della potenza*/ printf("Enter the base and exponent: \n"); scanf("%ld%ld", &base, &exponent); result = integerPower(base, exponent); printf("The power of %ld ^ %ld is %ld\n",base, exponent, result ); return 0; } long integerPower( long base, long exponent) { long value; /*Risultato della potenza*/ while ( exponent != 0 ){ value *= base; --exponent; } return value; }
|
L'unico problema è che immessi come valori 2 e 3 invece di restituire 8, ritorna
Enter the base and the exponent:
2 3
The power of 2 ^ 3 is 21494048
Possibile che il "^" possa causare problemi?
Come al solito critiche, consigli, miglioramenti son ben accetti!
Hola
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6379
Iscritto: 03/01/2010
|
value non è inizializzato
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Codice sorgente - presumibilmente C# |
long integerPower( long base, long exponent) { long value=base; /*Risultato della potenza*/ while ( exponent != 0 ){ value *= base; --exponent; } return value; }
|
If ok Then GOTO Avanza else GOTO Inizia
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6379
Iscritto: 03/01/2010
|
Postato originariamente da Ultimo:
Codice sorgente - presumibilmente C/C++ |
|
No ... semmai
Codice sorgente - presumibilmente C/C++ |
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Postato originariamente da nessuno:
Postato originariamente da Ultimo:
Codice sorgente - presumibilmente C/C++ |
|
No ... semmai
Codice sorgente - presumibilmente C/C++ |
|
si si giusto,
If ok Then GOTO Avanza else GOTO Inizia
|
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Se uno passasse un valore negativo in exponent si finirebbe in un ciclo non infinito ma quasi, con valori in uscita fuori controllo, o no? Non sarebbe meglio così?
Codice sorgente - presumibilmente C++ |
long integerPower( long base, unsigned long exponent ) { long value = 1; // Risultato della potenza while( exponent-- ) value *= base; return value; }
|
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6379
Iscritto: 03/01/2010
|
No, così non risolvi, anzi ...
Devi fare semplici considerazioni matematiche ... ovviamente avrai un risultato double ...
Codice sorgente - presumibilmente C# |
double Power( long base, long exponent ) { int sign=(exponent<0); double value = 1.0; // Risultato della potenza exponent=sign?-exponent:exponent; while( exponent-- ) value *= base; if(sign) value=1.0/value; return value; }
|
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Be', sì, così "tratti" anche gli esponenti negativi. Nel post propostoci, dal procedimento impiegato, sembrava che l'interesse fosse solo verso gli esponenti positivi.
Edit: allora potrebbe anche essere...
Codice sorgente - presumibilmente C# |
double Power( long base, long exponent ) { double value = 1.0; // Risultato della potenza int inc = exponent > 0 ? -1 : 1; for( ; exponent; exponent+=inc ) value *= base; return inc<0 ? value : 1.0/value; }
|
Non so se cambi qualcosa in termini di efficienza (non credo proprio), però siccome il mio PC ha uno schermo 1024x600 quelle due righe di codice in meno sono molto comode.
Ultima modifica effettuata da AldoBaldo il 30/10/2015 alle 13:46
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6379
Iscritto: 03/01/2010
|
Il concetto fondamentale è che i risultati siano corretti ... se vuoi risparmiare righe, puoi scrivere la mia precedente così
Codice sorgente - presumibilmente C# |
double PowerS( long base, long exponent ) { double value = 1.0; int sign = (exponent<0) ? -(exponent*=-1) : 0; while( exponent-- ) value *= base; return sign ? 1.0/value : value; }
|
Magari risulterà meno chiara ma è uguale ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|