Come si usa un esponente in C ++ con una variabile?
Domanda
Così mi rendo conto che #include è necessaria, e che ci sia un pow (x, y), dove x ^ y opere ... ma quando ho tentato di usare pow (2, (num-1)), è preso a calci indietro un errore ...
errorC2668: 'pow': chiamata ambigua alla funzione
la riga di codice che ho per essa è la seguente
perfect = (pow(2,(num-1))) * (pow(2,num)-1);
Tutti i consigli?
Grazie in anticipo
EDIT:
num è infatti dichiarato come un int.
num ha un valore, inizia a 1 e va a UINT_MAX
Aggiunto un asterisco all'equazione
Soluzione
Il compilatore non sa quale funzione chiamare pow (). I sovraccarichi elencati qui ha pronunciato la seguente lista:
float pow ( float base, float exponent );
double pow ( double base, double exponent );
long double pow ( long double base, long double exponent );
float pow ( float base, int exponent );
double pow ( double base, int exponent );
long double pow ( long double base, int exponent );
Il compilatore non indovinare quale usare. Rendere più esplicito con calchi.
perfect = (pow(2.,(double)(num-1))) < (pow(2.,(double)num)-1);
Ci possono essere alcuni calchi in più là, ma non sarà male a nessuno.
Altri suggerimenti
Queste sono le funzioni pow()
consentite in C ++. Il problema è che il codice ha un int come primo argomento e C ++ non so se per la promozione ad una doppia doppia o lungo.
double pow ( double base, double exponent );
long double pow ( long double base, long double exponent );
float pow ( float base, float exponent );
double pow ( double base, int exponent );
long double pow ( long double base, int exponent );
Prova a mettere in (double)2
invece di 2
.
perfect = (pow((double)2,(num-1))) * (pow((double)2,num)-1)
Aggiungi moltiplicazione mancante (o quello che volete) e anche ci dovrebbe essere punto e virgola alla fine della riga:
perfect = (pow(2,(num-1))) * (pow(2,num)-1) ;
errore C2668: 'pow': chiamata ambigua alla funzione in VC ++ 2005 solo , alex.m ha scritto,
"pow" (sovraccarichi) prende un galleggiante numero di tipo punto (singolo, doppio o lungo doppia precisione) come prima argomentazione, non un numero intero. Questo è dove l'errore proviene, dal momento che la compilatore non può indovinare il modo in cui si desidera il vostro intero lungo da convertire.
Basta provare a scrivere un'espressione cast, in questo modo:
Blocco di codice
c = pow ((doppio) numberOfScansCompleted, 2);
Quindi, se si tenta pow((double)2,(num-1))
, dovrebbe funzionare.
Divertente nota a margine, come ho digitato l'inizio di esso in Google, "pow chiamata ambigua alla funzione" è venuto in su come la parte superiore ha suggerito di ricerca.
Ricorda che puoi anche scrivere potenze intere di 2 con un operatore di spostamento:
int perfect = (1<<(num-1)) * ((1<<num) - 1);
ldexp
(incluso anche da <cmath>
):
double perfect = ldexp(1.0, num-1) * (ldexp(1.0, num) - 1);