¿Cuál es la función de C ++ para elevar un número a una potencia?

132

¿Cómo elevo un número a una potencia?

2^1

2^2

2^3

etc ...

Benoît
fuente
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.

Joey Robert
fuente
96

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(long double, long double);
pow(long double, 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.

Johannes Schaub - litb
fuente
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.

Cindy
fuente
2
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.

#include <cmath>

pow(2,3)

si estás en un sistema tipo Unix, man cmath

¿Es eso lo que estás preguntando?

Sujal

sujal
fuente
16

Use la función pow (x, y): ver aquí

Solo incluye math.h y estarás listo.

Adam Haile
fuente
13

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.

leander
fuente
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
Agricola
fuente
7
#include <iostream>
#include <conio.h>

using namespace 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);
}
Filza Naser
fuente
2
Su respuesta debe contener una explicación de su código y una descripción de cómo resuelve el problema.
AbcAeffchen
conio.h está en desuso, el archivo de encabezado no estándar no lo usa.
HaseeB Mir
7

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 :

int exp = 16;
for(int base_2 = 1; base_2 < (1 << exp); (base_2 <<= 1)){
std::cout << base_2 << std::endl;
}

salida de muestra:

1   2   4   8   16  32  64  128  256  512  1024  2048  4096  8192  16384  32768
HaseeB Mir
fuente
6

Es pow o powf en <math.h>

No hay un operador infijo especial como en Visual Basic o Python

Darío
fuente
2
powf () es una función C99 que no está en C ++.
newacct
6

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.

Jianchao Li
fuente
5
pow(2.0,1.0)
pow(2.0,2.0)
pow(2.0,3.0)

El título original de su pregunta es engañoso. Para cuadrar , use 2*2.

Zifre
fuente
2
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
Viktor
fuente
2

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;

    return 0;
}
usuario8857051
fuente
2

Primero agregue, #include <cmath>luego puede usar el powmétodo en su código, por ejemplo:

pow(3.5, 3);

Cuál 3.5 es base y 3 es exp

Mohammad Ansari
fuente
1

use la función pow () en la biblioteca cmath, tgmath o math.h.

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
int a,b;
cin >> a >> b;
cout << pow(a,b) << endl; // this calculates a^b

return 0;
}

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

long long int c=(long long int)(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: -

long long int __pow (long long int a, long long int b)
{
long long int q=1;
for (long long int i=0;i<=b-1;i++)
{
q=q*a;
}

return q;
}

y luego llamarlo cuando quieras,

int main()
{
long long int a,b;
cin >> a >> b;

long long int c=__pow(a,b);
cout << c << endl;

return 0;
}

Para números mayores que el rango de long long int, use boost library o strings.

Kartikey Tewari
fuente
1
Los nombres que contienen __están reservados, probablemente deberías elegir otra cosa.
HolyBlackCat