数を累乗するC ++関数とは何ですか?


132

数値を累乗するにはどうすればよいですか?

2^1

2^2

2^3

等...


タイトルは誤解を招くものでした。これは、二乗するだけでなく、一般に力についてです。編集して修正しました。
Zifre 2009年

30
一般的に2の累乗については、<<を使用します。
Thomas L Holaday、

1
はい、それは整数で動作します。。。
イマレット2012

3
具体的には、制限されたドメインの整数。2 ^ 70でも整数はオーバーフローします(ただし、浮動小数点数はそれを正確に表すことができます)
Ponkadoodle 2014

回答:



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であるのはfloat、それが取る必要がある、、doubleまたはlong doubleバージョンがわからないため、あいまいなエラーが発生するためです。3つすべてがintから浮動小数点への変換を必要とし、3つすべてが同様にコストがかかります。

したがって、必ず最初の引数を入力して、3つの引数のいずれかに完全に一致するようにしてください。私は通常使用しますdouble

pow(2.0, N)

何人かの弁護士がまた私からがらくた。私は自分でこの落とし穴に陥ることが多いので、警告します。


int N; pow(2.0, N)まだあいまいです could be 'pow(double,int)' or 'pow(double,double)'::-/→キャスト
Marvin

3
コメントを追加する前にコメントを読むことをお勧めします。;-)私はそれが曖昧さを与えると説明しました。(VS2008のコンパイラ)
Marvin

1
@Marvin:Visual C ++ 2010 Expressには問題ありませんstd::pow(2.0, 3)
キーストンプソン

5
私はもう一度返信するつもりです、時間をかけてより多くの傲慢成長してきましたので、@Marvin:あなたはなかったではないと言う「「... ...コンパイラによって曖昧として拒否された」が、あなたが言った...まだあいまいになります:... "、バックアップを提供していません。コンパイラの振る舞いを示唆することはバックアップになるかもしれませんが、これが曖昧ではないことを第一原理(仕様自体)からコンパイラとは別に示した場合、私はより高い根拠を得ました。悲しいかな、C ++コンパイラにはバグがあるかもしれません。
Johannes Schaub-litb

1
またpow(2, N)、C ++ 11以降、任意の算術型をパラメーターとして受け取るテンプレート関数があるため、これも一義的であると思います。
エール

28

C ++では、「^」演算子はビット単位のORです。パワーアップには効きません。x << nは2進数の左シフトであり、xを2 n回乗算するのと同じであり、2を累乗する場合にのみ使用できます。POW関数は、一般的に機能する数学関数です。


2
具体的に1 << nは、2のn乗、またはと同じ2^nです。
Ashish Ahuja

1
1 << n@AshishAhujaコメントの「1」がなぜなのかわからなかった人にとっては、シリーズがこのようになっている 1 << 0 = 1から2^0 = 1です。 1 << 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
回答には、コードの説明と、コードが問題を解決する方法の説明を含める必要があります。
AbcAeffchen 14

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()は、C ++にはないC99関数です。
newacct 2009年

6

多くの回答が提案pow()または類似の代替案または独自の実装を持っています。ただし、質問の例(2^12^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>、次にpowコードでmethodeを使用できます。

pow(3.5, 3);

これは3.5であるベース3があるEXP


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以外のデータ型としてpowerに入力を与えると、答えはdoubleの値に昇格されることに注意してください。つまり、入力を受け取り、出力をdoubleとして提供します。long double入力の場合、戻り値の型はlong doubleです。答えをint useに変更するには、int c =(int)pow(a、b)

ただし、一部の数値については、正解よりも少ない数値になる可能性があることに注意してください。したがって、たとえば5 ^ 2を計算する必要がある場合、一部のコンパイラでは24.99999999999として答えを返すことができます。データ型をintに変更すると、正しい答えは25ではなく24になります。だから、これをやって

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を返し、1350851717672992000としてintに昇格されるためです。次のようなシナリオのカスタム電力関数:

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の範囲より大きい数値の場合は、ブーストライブラリまたは文字列を使用します。


1
を含む名前__は予約されています。おそらく別のものを選択する必要があります。
HolyBlackCat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.