Что такое функция C ++ для возведения числа в степень?


132

Как мне возвести число в степень?

2^1

2^2

2^3

и т.д...


Название вводило в заблуждение. Речь идет о полномочиях в целом, а не только о квадрате. Я отредактировал и исправил.
Zifre

31
Если вообще речь идет о степени двойки, используйте <<.
Thomas L Holaday

1
Да, это будет работать с целыми числами . , ,
imallett

3
В частности, целые числа ограниченного домена . Даже всего 2 ^ 70 приведет к переполнению целого числа (но число с плавающей запятой может представлять его точно )
Ponkadoodle

Ответы:



96

std::powв <cmath>шапке есть такие перегрузки:

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

Теперь ты не можешь просто сделать

pow(2, N)

с N будучи ИНТ, потому что он не знает , какой из float, doubleили long doubleверсии он должен принять, и вы получите ошибку неоднозначности. Для всех трех потребуется преобразование из int в число с плавающей запятой, и все три одинаково дороги!

Поэтому убедитесь, что первый аргумент введен так, чтобы он идеально соответствовал одному из этих трех. Я обычно используюdouble

pow(2.0, N)

Снова какая-то адвокатская хрень. Я сам часто попадал в эту ловушку, поэтому хочу вас об этом предупредить.


int N; pow(2.0, N)все равно будет двусмысленно:: could be 'pow(double,int)' or 'pow(double,double)'- / → cast
Marvin

3
Рекомендую прочитать свой комментарий перед тем, как добавлять комментарий. ;-) Я объяснил, что это ДЕЙСТВИТЕЛЬНО дает двусмысленность. (Компилятор VS2008)
Марвин

1
@Marvin: Visual C ++ 2010 Express не имеет проблем с std::pow(2.0, 3).
Кейт Томпсон

5
@Marvin, поскольку со временем я стал более высокомерным, я собираюсь ответить еще раз: вы не сказали, что "... отклонено компилятором как двусмысленное ...", но вы сказали: "... все равно будет двусмысленно : ... ", для которого вы не предоставили поддержку. Намек на поведение компилятора может быть резервной копией, но если я показал независимо от компиляторов из первых принципов (самой спецификации), что это не двусмысленно, у меня есть более высокая позиция. Увы, в компиляторах C ++ могут быть ошибки.
Йоханнес Шауб - лит

1
Я думаю, что это тоже pow(2, N)однозначно, начиная с C ++ 11, потому что есть функция-шаблон, принимающая любой арифметический тип в качестве параметров.
Ale

29

В C ++ оператор «^» - это побитовое ИЛИ. Не работает для возведения в степень. X << n - это сдвиг двоичного числа влево, который совпадает с умножением x на 2 n раз и может использоваться только при возведении 2 в степень. Функция POW - это математическая функция, которая работает в общем случае.


2
В частности, 1 << nэто то же самое, что возведение 2 в степень n, или 2^n.
Ашиш

1
Для тех, кто не 1 << nпонял, почему "1" в комментарии @AshishAhuja, это потому, что 1 << 0 = 1с тех пор серия идет следующим образом 2^0 = 1; 1 << 1 = 2поскольку 2^1 = 2; 1 << 2 = 4с тех пор 2^2 = 4 и так далее ...
СП5

16

Вы должны уметь использовать в математике обычные методы C.

#include <cmath>

pow(2,3)

если вы используете unix-подобную систему, man cmath

Вы об этом спрашиваете?

Sujal



13

Хотя pow( base, exp )это отличное предложение, имейте в виду, что он обычно работает с плавающей запятой.

Это может быть, а может и не быть тем, что вам нужно: в некоторых системах простой цикл умножения на аккумулятор будет быстрее для целочисленных типов.

И, в частности, для квадрата, вы могли бы просто перемножить числа вместе, с плавающей запятой или целым числом; это не совсем снижение читабельности (ИМХО), и вы избегаете накладных расходов на производительность при вызове функции.


И да, это может попасть в категорию «преждевременной оптимизации», но я всегда считаю полезным знать о таких вещах, особенно если вам приходится программировать в среде с ограниченными ресурсами.
leander

11

У меня недостаточно репутации, чтобы комментировать, но если вам нравится работать с QT, у них есть своя версия.

    #include <QtCore/qmath.h>
    qPow(x, y); // returns x raised to the y power.

Или, если вы не используете QT, cmath имеет в основном то же самое.

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

// определение функции 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
Ваш ответ должен содержать объяснение вашего кода и описание того, как он решает проблему.
AbcAeffchen

conio.h устарел, нестандартный заголовочный файл не используется.
HaseeB Mir

7

если вы хотите иметь дело только с base_2, я рекомендую использовать оператор сдвига влево << вместо математической библиотеки .

образец кода :

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

образец вывода:

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

6

Это пау или пауф в <math.h>

Нет специального инфиксного оператора, как в Visual Basic или Python.


2
powf () - это функция C99, которой нет в C ++.
newacct

6

Во многих ответах предлагались pow()или аналогичные альтернативы или их собственные реализации. Однако, учитывая примеры ( 2^1, 2^2и 2^3) в вашем вопросе, я бы предположил, нужно ли вам только возвести 2в целую степень. Если это так, я бы посоветовал вам использовать 1 << nдля 2^n.


5
pow(2.0,1.0)
pow(2.0,2.0)
pow(2.0,3.0)

Ваш исходный заголовок вопроса вводит в заблуждение. Чтобы просто квадрат , используйте 2*2.


4

Обратите внимание, что использование pow(x,y)менее эффективно, чем x*x*xy раз, как показано и ответили здесь https://stackoverflow.com/a/2940800/319728 .

Так что если вы собираетесь использовать эффективность x*x*x.


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

Я использую библиотеку cmathили math.hдля того, чтобы использовать pow()библиотечные функции, которые заботятся о полномочиях

#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

Сначала добавьте, #include <cmath>затем вы можете использовать powметод в своем коде, например:

pow(3.5, 3);

Какие 3,5 - базовые, а 3 - опытные


1

используйте функцию pow () в библиотеке cmath, tgmath или 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;
}

обратите внимание, что если вы вводите power как любой тип данных, кроме long double, то ответ будет повышен до типа double. то есть он будет принимать входные данные и выдавать двойные выходные данные. для длинных двойных входов тип возвращаемого значения - long double. для изменения ответа на использование int int c = (int) pow (a, b)

Но помните, что для некоторых чисел это может привести к получению числа меньше правильного. так, например, вам нужно вычислить 5 ^ 2, тогда ответ может быть возвращен как 24.99999999999 на некоторых компиляторах. при изменении типа данных на int ответ будет 24, а не 25 правильным ответом. Итак, сделай это

int c=(int)(pow(a,b)+0.5)

Теперь ваш ответ будет правильным. кроме того, для очень больших чисел данные теряются при изменении типа данных double на long long int. например вы пишете

long long int c=(long long int)(pow(a,b)+0.5);

и введите a = 3 и b = 38, тогда результат будет 1350851717672992000, а правильный ответ - 1350851717672992089, это происходит потому, что функция pow () возвращает 1.35085e + 18, которая повышается до int как 1350851717672992000. Я предлагаю написать настраиваемая функция мощности для таких сценариев, например: -

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

а затем вызывая его, когда захотите,

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

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

return 0;
}

Для чисел, превышающих диапазон long long int, используйте либо библиотеку boost, либо строки.


1
Имена, содержащиеся __, зарезервированы, вероятно, вам следует выбрать что-то другое.
HolyBlackCat
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.