El título fue engañoso. Se trata de poderes en general, no solo de cuadratura. Lo edité y lo arreglé.
Zifre
30
Si se trata de potencias de 2 en general, use <<.
Thomas L Holaday
1
Sí, eso funcionará para enteros . . .
imallett
3
Específicamente, enteros de un dominio limitado . Incluso solo 2 ^ 70 desbordará un número entero (pero un flotador puede representarlo con precisión )
Ponkadoodle
Respuestas:
147
pow () en la biblioteca cmath. Más información aquí . No olvides ponerlo #include<cmath>en la parte superior del archivo.
std::powen el <cmath>encabezado tiene estas sobrecargas:
pow(float,float);
pow(float,int);
pow(double,double);// taken over from C
pow(double,int);
pow(longdouble,longdouble);
pow(longdouble,int);
Ahora no puedes simplemente hacer
pow(2, N)
siendo N un entero, porque no sabe cuál de float, doubleo long doublela versión que debe tomar, y se obtendría un error de ambigüedad. ¡Los tres necesitarían una conversión de int a coma flotante, y los tres son igualmente costosos!
Por lo tanto, asegúrese de escribir el primer argumento para que coincida perfectamente con uno de esos tres. Yo suelo usardouble
pow(2.0, N)
Algún abogado me ha vuelto a joder. A menudo me he caído en esta trampa, así que te voy a advertir sobre ello.
int N; pow(2.0, N)todavía sería ambiguo:: could be 'pow(double,int)' or 'pow(double,double)'- / → reparto
Marvin
3
Recomiendo leer mi comentario antes de agregar un comentario. ;-) Le expliqué que sí da una ambigüedad. (Compilador de VS2008)
Marvin
1
@Marvin: Visual C ++ 2010 Express no tiene ningún problema std::pow(2.0, 3).
Keith Thompson el
55
@Marvin ya he crecido durante el tiempo más arrogante, voy a responder una vez más: ¿Te ha no dice "... es rechazada como compilador por ambigua ...", sino que dijo:" ... aún sería ambigua : ... ", para lo cual no proporcionó respaldo. Indicar el comportamiento del compilador puede ser una copia de seguridad, pero si he demostrado, independientemente de los compiladores, desde los primeros principios (la propia especificación) que esto no es ambiguo, tengo el terreno más elevado. Por desgracia, los compiladores de C ++ pueden tener errores.
Johannes Schaub - litb
1
Creo que eso tampoco pow(2, N)es ambiguo desde C ++ 11, porque hay una función de plantilla que recibe cualquier tipo aritmético como parámetros.
Ale
28
En C ++, el operador "^" es un OR bit a bit. No funciona para elevar a un poder. La x << n es un desplazamiento a la izquierda del número binario que es lo mismo que multiplicar x por 2 n número de veces y que solo se puede usar al elevar 2 a una potencia. La función POW es una función matemática que funcionará genéricamente.
Específicamente, 1 << nes lo mismo que elevar 2 a la potencia n, o 2^n.
Ashish Ahuja
1
Para aquellos que no 1 << nentendieron por qué el "1" en el comentario de @AshishAhuja, es porque la serie sigue así 1 << 0 = 1desde entonces 2^0 = 1; 1 << 1 = 2puesto 2^1 = 2; 1 << 2 = 4desde entonces 2^2 = 4 y así sucesivamente ...
JS5
16
Debería poder utilizar métodos C normales en matemáticas.
Si bien pow( base, exp )es una gran sugerencia, tenga en cuenta que generalmente funciona en coma flotante.
Esto puede o no ser lo que desea: en algunos sistemas, un simple bucle que se multiplica en un acumulador será más rápido para los tipos enteros.
Y para el cuadrado específicamente, también podría multiplicar los números juntos, punto flotante o entero; en realidad no es una disminución de la legibilidad (en mi humilde opinión) y evita la sobrecarga de rendimiento de una llamada de función.
Y sí, esto puede caer en la categoría de "optimización prematura", pero siempre me parece bueno estar al tanto de cosas como esta, especialmente si tiene que programar en entornos de recursos limitados.
leander
11
No tengo suficiente reputación para comentar, pero si te gusta trabajar con QT, tienen su propia versión.
#include<QtCore/qmath.h>
qPow(x, y);// returns x raised to the y power.
O si no estás usando QT, cmath tiene básicamente lo mismo.
#include<cmath>double x =5, y =7;//As an example, 5 ^ 7 = 78125
pow(x, y);//Should return this: 78125
#include<iostream>#include<conio.h>usingnamespace std;double raiseToPow(double,int)//raiseToPow variable of type double which takes arguments (double, int)void main(){double x;//initializing the variable x and i int i;
cout<<"please enter the number";
cin>>x;
cout<<"plese enter the integer power that you want this number raised to";
cin>>i;
cout<<x<<"raise to power"<<i<<"is equal to"<<raiseToPow(x,i);}
// definición de la función raiseToPower
double raiseToPow(double x,int power){double result;int i;
result =1.0;for(i=1, i<=power;i++){
result = result*x;}return(result);}
Muchas respuestas han sugerido pow()alternativas similares o sus propias implementaciones. Sin embargo, dados los ejemplos ( 2^1, 2^2y 2^3) en su pregunta, yo supongo si sólo es necesario para elevar 2a una potencia entera. Si este es el caso, sugeriría que usted utilice 1 << npara 2^n.
int power (int i,int ow)// works only for ow >= 1{// but does not require <cmath> library!=)if(ow >1){
i = i * power (i, ow -1);}return i;}
cout << power(6,7);//you can enter variables here
Estoy usando la biblioteca cmatho math.hpara hacer uso de las pow()funciones de la biblioteca que se encargan de los poderes
#include<iostream>#include<cmath>int main(){double number,power, result;
cout<<"\nEnter the number to raise to power: ";
cin>>number;
cout<<"\nEnter the power to raise to: ";
cin>>power;
result = pow(number,power);
cout<<"\n"<< number <<"^"<< power<<" = "<< result;return0;}
use la función pow () en la biblioteca cmath, tgmath o math.h.
#include<iostream>#include<cmath>usingnamespace std;int main(){int a,b;
cin >> a >> b;
cout << pow(a,b)<< endl;// this calculates a^breturn0;}
tenga en cuenta que si le da entrada al poder como cualquier tipo de datos que no sea el doble largo, entonces la respuesta se promoverá a la del doble. es decir, tomará entrada y dará salida como doble. para entradas dobles largas, el tipo de retorno es doble largo. para cambiar la respuesta a int use, int c = (int) pow (a, b)
Pero, tenga en cuenta que para algunos números esto puede resultar en un número menor que la respuesta correcta. así, por ejemplo, debe calcular 5 ^ 2, luego la respuesta puede devolverse como 24.99999999999 en algunos compiladores. al cambiar el tipo de datos a int, la respuesta será 24 en lugar de 25 la respuesta correcta. Entonces, haz esto
int c=(int)(pow(a,b)+0.5)
Ahora, tu respuesta será correcta. también, para números muy grandes, los datos se pierden al cambiar el tipo de datos doble a largo largo int. por ejemplo escribes
longlongint c=(longlongint)(pow(a,b)+0.5);
y dé la entrada a = 3 yb = 38, entonces el resultado será 1350851717672992000, mientras que la respuesta correcta es 1350851717672992089, esto sucede porque la función pow () devuelve 1.35085e + 18, que se promociona a int como 1350851717672992000. Sugiero escribir un función de potencia personalizada para tales escenarios, como: -
Respuestas:
pow () en la biblioteca cmath. Más información aquí . No olvides ponerlo
#include<cmath>
en la parte superior del archivo.fuente
std::pow
en el<cmath>
encabezado tiene estas sobrecargas:Ahora no puedes simplemente hacer
siendo N un entero, porque no sabe cuál de
float
,double
olong double
la versión que debe tomar, y se obtendría un error de ambigüedad. ¡Los tres necesitarían una conversión de int a coma flotante, y los tres son igualmente costosos!Por lo tanto, asegúrese de escribir el primer argumento para que coincida perfectamente con uno de esos tres. Yo suelo usar
double
Algún abogado me ha vuelto a joder. A menudo me he caído en esta trampa, así que te voy a advertir sobre ello.
fuente
int N; pow(2.0, N)
todavía sería ambiguo::could be 'pow(double,int)' or 'pow(double,double)'
- / → repartostd::pow(2.0, 3)
.pow(2, N)
es ambiguo desde C ++ 11, porque hay una función de plantilla que recibe cualquier tipo aritmético como parámetros.En C ++, el operador "^" es un OR bit a bit. No funciona para elevar a un poder. La x << n es un desplazamiento a la izquierda del número binario que es lo mismo que multiplicar x por 2 n número de veces y que solo se puede usar al elevar 2 a una potencia. La función POW es una función matemática que funcionará genéricamente.
fuente
1 << n
es lo mismo que elevar 2 a la potencia n, o2^n
.1 << n
entendieron por qué el "1" en el comentario de @AshishAhuja, es porque la serie sigue así1 << 0 = 1
desde entonces2^0 = 1
;1 << 1 = 2
puesto2^1 = 2
;1 << 2 = 4
desde entonces2^2 = 4
y así sucesivamente ...Debería poder utilizar métodos C normales en matemáticas.
#include <cmath>
pow(2,3)
si estás en un sistema tipo Unix,
man cmath
¿Es eso lo que estás preguntando?
Sujal
fuente
Use la función pow (x, y): ver aquí
Solo incluye math.h y estarás listo.
fuente
Si bien
pow( base, exp )
es una gran sugerencia, tenga en cuenta que generalmente funciona en coma flotante.Esto puede o no ser lo que desea: en algunos sistemas, un simple bucle que se multiplica en un acumulador será más rápido para los tipos enteros.
Y para el cuadrado específicamente, también podría multiplicar los números juntos, punto flotante o entero; en realidad no es una disminución de la legibilidad (en mi humilde opinión) y evita la sobrecarga de rendimiento de una llamada de función.
fuente
No tengo suficiente reputación para comentar, pero si te gusta trabajar con QT, tienen su propia versión.
O si no estás usando QT, cmath tiene básicamente lo mismo.
fuente
// definición de la función raiseToPower
fuente
si solo desea tratar con base_2, le recomiendo usar el operador de desplazamiento a la izquierda << en lugar de la biblioteca matemática .
Código de muestra :
salida de muestra:
fuente
Es pow o powf en
<math.h>
No hay un operador infijo especial como en Visual Basic o Python
fuente
Muchas respuestas han sugerido
pow()
alternativas similares o sus propias implementaciones. Sin embargo, dados los ejemplos (2^1
,2^2
y2^3
) en su pregunta, yo supongo si sólo es necesario para elevar2
a una potencia entera. Si este es el caso, sugeriría que usted utilice1 << n
para2^n
.fuente
El título original de su pregunta es engañoso. Para cuadrar , use
2*2
.fuente
Tenga en cuenta que el uso de
pow(x,y)
es menos eficiente quex*x*x
y veces como se muestra y responde aquí https://stackoverflow.com/a/2940800/319728 .Entonces, si vas por el uso eficiente
x*x*x
.fuente
fuente
Estoy usando la biblioteca
cmath
omath.h
para hacer uso de laspow()
funciones de la biblioteca que se encargan de los poderesfuente
Primero agregue,
#include <cmath>
luego puede usar elpow
método en su código, por ejemplo:Cuál 3.5 es base y 3 es exp
fuente
use la función pow () en la biblioteca cmath, tgmath o math.h.
tenga en cuenta que si le da entrada al poder como cualquier tipo de datos que no sea el doble largo, entonces la respuesta se promoverá a la del doble. es decir, tomará entrada y dará salida como doble. para entradas dobles largas, el tipo de retorno es doble largo. para cambiar la respuesta a int use, int c = (int) pow (a, b)
Pero, tenga en cuenta que para algunos números esto puede resultar en un número menor que la respuesta correcta. así, por ejemplo, debe calcular 5 ^ 2, luego la respuesta puede devolverse como 24.99999999999 en algunos compiladores. al cambiar el tipo de datos a int, la respuesta será 24 en lugar de 25 la respuesta correcta. Entonces, haz esto
Ahora, tu respuesta será correcta. también, para números muy grandes, los datos se pierden al cambiar el tipo de datos doble a largo largo int. por ejemplo escribes
y dé la entrada a = 3 yb = 38, entonces el resultado será 1350851717672992000, mientras que la respuesta correcta es 1350851717672992089, esto sucede porque la función pow () devuelve 1.35085e + 18, que se promociona a int como 1350851717672992000. Sugiero escribir un función de potencia personalizada para tales escenarios, como: -
y luego llamarlo cuando quieras,
Para números mayores que el rango de long long int, use boost library o strings.
fuente
__
están reservados, probablemente deberías elegir otra cosa.