¿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 ...


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.


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.


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.


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



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.


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

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);
}

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

6

Es pow o powf en <math.h>

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


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.


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.



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

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;
}

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


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.


1
Los nombres que contienen __están reservados, probablemente deberías elegir otra cosa.
HolyBlackCat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.