Яка функція C ++, щоб підняти число до потужності?


132

Як підняти число до потужності?

2^1

2^2

2^3

тощо ...


Назва була оманливою. Йдеться про повноваження взагалі, а не просто квадрати. Я її відредагував і виправив.
Зіфре

30
Якщо мова йде про повноваження 2 загалом, використовуйте <<.
Томас Л Холадей

1
Так, це буде працювати для цілих чисел . . .
imallett

3
Зокрема, цілі числа обмеженого домену . Навіть просто 2 ^ 70 переповнить ціле число (але поплавок може точно його зобразити )
Ponkadoodle

Відповіді:


147

pow () у бібліотеці cmath. Більше інформації тут . Не забудьте поставити #include<cmath>у верхній частині файлу.


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)'- / → кидок
Marvin

3
Рекомендую прочитати мій коментар, перш ніж додавати коментар. ;-) Я пояснив, що це НЕ дає двозначності. (Укладач VS2008)
Марвін

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

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

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

28

У C ++ оператор "^" є побітовим АБО. Це не працює для підняття до влади. X << n - лівий зсув двійкового числа, який є таким самим, як множення x на 2 n кількість разів, яке можна використовувати лише при піднятті 2 до потужності. Функція POW - це математична функція, яка буде працювати загально.


2
Зокрема, 1 << nце те саме, що підняти 2 до потужності n, або 2^n.
Ashish Ahuja

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

16

Ви повинні мати можливість використовувати в математиці звичайні методи С.

#include <cmath>

pow(2,3)

якщо ви використовуєте систему, схожу на unix, man cmath

Це ти просиш?

Sujal



13

Хоча pow( base, exp )це чудова пропозиція, майте на увазі, що він зазвичай працює з плаваючою комою.

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

А конкретно для квадрата, ви можете просто просто помножити числа разом, плаваюча точка чи ціле число; це насправді не зменшення читабельності (IMHO), і ви уникаєте накладних витрат виклику функції.


І так, це може потрапити до категорії "передчасна оптимізація", але мені завжди добре бути в курсі подібних речей, особливо якщо вам доводиться програмувати в обмежених ресурсах.
орендар

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

// визначення функції підвищенняToPower

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 Мир

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.



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>тоді ви можете використовувати powmethode у своєму коді, наприклад:

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

зауважте, що якщо ви вводите потужність як будь-який тип даних, окрім довгого подвійного, відповідь буде перенесена на відповідь подвійного. тобто це буде брати вклад і давати вихід як подвійний. для довгих подвійних входів тип повернення довгий подвійний. для зміни відповіді на використання int, int c = (int) pow (a, b)

Але майте на увазі, що для деяких цифр це може призвести до меншої кількості, ніж правильна відповідь. так, наприклад, вам доведеться обчислити 5 ^ 2, тоді відповідь можна повернути як 24.99999999999 на деяких компіляторах. на зміну типу даних на int відповідь буде 24, а не 25 правильна відповідь. Отже, зробіть це

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

Тепер ваша відповідь буде правильною. Крім того, для дуже великої кількості дані втрачаються при зміні типу даних подвійний на довгий довгий 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;
}

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


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