¿Cómo se utiliza un exponente en C ++ con una variable?
Pregunta
Así que me di cuenta de que # include es necesario, y que no es un pow (x, y), donde x ^ Y las obras ... pero cuando me trató de utilizar pow (2, (num-1)), se iniciaron volver un error ...
errorC2668: 'prisionero de guerra': llamada ambigua a función sobrecargada
la línea de código que tengo para es como sigue
perfect = (pow(2,(num-1))) * (pow(2,num)-1);
¿Alguna recomendación?
Gracias de antemano
EDIT:
num se declara de hecho, como un int.
num tiene un valor, comienza a 1 y se va a UINT_MAX
Se ha añadido un asterisco a la ecuación
Solución
El compilador no sabe qué función pow () para llamar. Las sobrecargas que aparece aquí da la siguiente 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 );
El compilador no va a adivinar cuál de ellos utilizar. Hacerla explícita con yesos.
perfect = (pow(2.,(double)(num-1))) < (pow(2.,(double)num)-1);
Puede haber algunos moldes adicionales allí, pero no va a doler nada.
Otros consejos
Estas son las funciones pow()
permitidas en C ++. El problema es que el código tiene un entero como primer argumento y C ++ no sé si para promover a un doble doble o larga.
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 );
Trate de poner en (double)2
en lugar de sólo 2
.
perfect = (pow((double)2,(num-1))) * (pow((double)2,num)-1)
Añadir multiplicación faltante (o lo que quiere) y también debería ser punto y coma al final de la línea:
perfect = (pow(2,(num-1))) * (pow(2,num)-1) ;
C2668 de error: 'prisionero de guerra': llamada ambigua a función sobrecargada en VC ++ 2005, sólo , alex.m escribió:
"prisionero de guerra" (ninguna sobrecarga) toma una flotación número de tipo de punto (simple, doble o larga de doble precisión) como primera argumento, no es un entero. Esto es donde el error viene, ya que la compilador no puede adivinar la forma que desee su entero largo a convertir.
Solo trata de escribir una expresión de conversión, de esta manera:
bloque de código
c = pow ((doble) numberOfScansCompleted, 2);
Por lo tanto, si se intenta pow((double)2,(num-1))
, que debería funcionar.
nota divertida, mientras escribía el inicio de la misma en Google, "prisionero de guerra llamada ambigua a función sobrecargada" surgió como la parte superior sugirió búsqueda.
Recuerde que también puede escribir potencias enteras de 2 con un operador de desplazamiento:
int perfect = (1<<(num-1)) * ((1<<num) - 1);
ldexp
(también incluido desde <cmath>
):
double perfect = ldexp(1.0, num-1) * (ldexp(1.0, num) - 1);