将数字加幂的C ++函数是什么?


132

我如何将数字提高到幂?

2^1

2^2

2^3

等等...


标题令人误解。这是关于一般权力的,而不仅仅是平方。我编辑并修复它。
Zifre

30
如果通常是2的幂,请使用<<。
Thomas L Holaday

1
是的,这将适用于integers。。。
malletlet

3
具体来说,是有限域的整数。甚至只有2 ^ 70也会溢出整数(但是浮点数可以精确地表示它)
Ponkadoodle

Answers:



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为一个int,因为它不知道的floatdoublelong 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的编译器)
Marvin

1
@Marvin:Visual C ++ 2010 Express没问题std::pow(2.0, 3)
基思·汤普森

5
@Marvin因为我已经变得更加嚣张随着时间的推移,我要再次回复:你没有说“......被拒绝由编译器暧昧......”但你说:” ......仍然是模棱两可:...”,您没有提供任何备份。提示编译器行为可能是一个备份,但是,如果我从第一原理(规范本身)的角度出发,从编译器中独立地证明这并不是模棱两可的话,那么我就具有更高的立场。C,C ++编译器可能会出现错误。
Johannes Schaub-litb

1
我认为pow(2, N)自C ++ 11起,这也是明确的,因为有一个模板函数接收任何算术类型作为参数。
Ale

28

在C ++中,“ ^”运算符是按位或。它对提升能力无效。x << n是二进制数的左移,与将x乘以2 n次相同,并且只能在将2乘幂时使用。POW函数是可以正常运行的数学函数。


2
具体来说,1 << n与将2提高到幂n或相同2^n
Ashish Ahuja,

1
对于那些不明白为什么1 << n@AshishAhuja中的“ 1”进行注释的人,是因为该系列 1 << 0 = 1从此开始2^0 = 11 << 1 = 2从此2^1 = 2; 1 << 2 = 4从此2^2 = 4 等等……
JS5

16

您应该能够在数学中使用普通的C方法。

#include <cmath>

pow(2,3)

如果您使用的是类似Unix的系统, man cmath

那是你要的吗

苏加尔



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

//函数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
您的答案应包含对代码的说明以及如何解决问题的说明。
2014年

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这样的特殊infix运算符


2
powf()是C99中没有的C99函数。
newacct

6

许多答案已经提出了建议pow()或类似的替代方案或它们自己的实现。然而,给出的例子(2^12^22^3在你的问题),我猜你是否只需要筹集2到的整数次幂。如果是这样的话,我建议你使用1 << n2^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

我正在使用库cmathmath.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;
}


1

在cmath,tgmath或math.h库中使用pow()函数。

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

请注意,如果您以长整型以外的任何数据类型来输入功率,则答案将提升为双精度。也就是说,它将接受输入,并将输出加倍。对于long 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.