숫자를 거듭 제곱하는 C ++ 함수는 무엇입니까?


132

숫자를 거듭 제곱하려면 어떻게해야합니까?

2^1

2^2

2^3

기타...


제목이 잘못되었습니다. 이것은 단지 제곱하는 것이 아니라 일반적으로 힘에 관한 것입니다. 나는 그것을 편집하고 고쳤다.
Zifre

30
일반적으로 2의 거듭 제곱 인 경우 <<를 사용하십시오.
Thomas L Holaday 19

1
예, 정수에서 작동합니다 . . .
imallett

3
구체적으로, 제한된 도메인의 정수 . 심지어 2 ^ 70조차도 정수를 오버플로합니다 (그러나 float는 정확하게 나타낼 수 있습니다 )
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이있는 int 인으로 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 컴파일러)
Marvin

1
@Marvin : Visual C ++ 2010 Express에는 문제가 없습니다 std::pow(2.0, 3).
Keith Thompson

5
당신은 않았다 내가 더 오만 이상 시간을 성장했습니다 이후 @Marvin, 나는 다시 한 번 답장을거야 하지 모호 할 아직도 ... "것"... ... 컴파일러에 의해 모호한으로 거부 '라고하지만 당신은 말했다 : ... ". 백업을 제공하지 않았습니다. 컴파일러 동작에 대한 힌트는 백업 일 수 있지만, 모호하지 않다는 첫 번째 원칙 (사양 자체)의 컴파일러와 독립적으로 보여 주면 더 높은 기반을 얻었습니다. 아아, C ++ 컴파일러에는 버그가있을 수 있습니다.
Johannes Schaub-litb

1
pow(2, N)매개 변수로 산술 유형을받는 템플릿 함수가 있기 때문에 C ++ 11부터 모호하지 않다고 생각합니다 .
Ale

28

C ++에서 "^"연산자는 비트 단위 OR입니다. 권력을 높이는 데는 효과가 없습니다. x << n은 x에 2 n 횟수를 곱하는 것과 같으며 2를 거듭 제곱 할 때만 사용할 수있는 이진수의 왼쪽 시프트입니다. POW 함수는 일반적으로 작동하는 수학 함수입니다.


2
구체적으로, 1 << n2를 제곱 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)

유닉스 계열 시스템이라면 man cmath

그게 당신이 묻는 것입니까?

수잘



13

하지만 pow( base, exp )좋은 제안을, 그것은 일반적으로 부동 소수점에서 작동하는지 유의하십시오.

이것은 원하는 것이거나 아닐 수도 있습니다. 일부 시스템에서는 누산기의 간단한 루프 곱셈이 정수 유형의 경우 더 빠릅니다.

그리고 특히 제곱의 경우 숫자를 부동 소수점 또는 정수로 곱할 수도 있습니다. 실제로 가독성의 저하 (IMHO)가 아니며 함수 호출의 성능 오버 헤드를 피할 수 있습니다.


그렇습니다. 이것은 "조기 최적화"범주에 속할 수 있지만, 특히 제한된 리소스 환경에서 프로그래밍해야하는 경우에는 항상 이와 같은 것을 알고있는 것이 좋습니다.
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

pow 또는 powf in <math.h>

Visual Basic 또는 Python과 같은 특수 접두사 연산자는 없습니다.


2
powf ()는 C ++에없는 C99 함수입니다.
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

먼저 코드에 methode를 #include <cmath>사용할 수 있습니다 pow.

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로 승격됩니다. 즉, 입력을 받아 출력을 두 배로 줄 것입니다. 긴 이중 입력의 경우 리턴 유형은 긴 이중입니다. 대답을 int 사용으로 변경하기 위해 int c = (int) pow (a, b)

그러나 일부 숫자의 경우 정답보다 숫자가 적을 수 있습니다. 예를 들어 5 ^ 2를 계산 해야하는 경우 일부 컴파일러에서 답을 24.99999999999로 반환 할 수 있습니다. int로 데이터 유형을 변경하면 정답은 25가 아니라 24가됩니다. 그래서, 이렇게

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

이제 답이 맞을 것입니다. 또한 매우 많은 수의 경우 데이터 유형을 double to 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.