math_pow
math_pow (거듭제곱)
std::pow는 base를 거듭제곱 exp로 올린 값을 계산하는 함수예요. 즉 base^exp를 반환해요.
출처: cppreference
본문
<cmath> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.
float pow ( float base, float exp );
double pow ( double base, double exp );
long double pow ( long double base, long double exp );
(1) (until C++23)
/* floating-point-type */
pow ( /* floating-point-type */ base,
/* floating-point-type */ exp )
(since C++23) (constexpr since C++26)
float pow ( float base, int exp );
double pow ( double base, int exp );
long double pow ( long double base, int exp );
(2) (until C++11)
float powf( float base, float exp );
(3) (since C++11) (constexpr since C++26)
long double powl( long double base, long double exp );
(4) (since C++11) (constexpr since C++26)
추가 오버로드 (since C++11): <cmath> 헤더에 정의돼요.
template< class Arithmetic1, class Arithmetic2 >
/* common-floating-point-type */
pow ( Arithmetic1 base, Arithmetic2 exp );
(A) (constexpr since C++26)
- 1-4) base를 거듭제곱 exp로 올린 값을 계산해요. 라이브러리는 매개변수 base와 exp의 타입으로 모든 cv 한정되지 않은 부동소수점 타입에 대한
std::pow오버로드를 제공해요. (C++23부터) - A) 산술 타입의 다른 모든 조합에 대해 추가 오버로드가 제공돼요.
(C++11부터)
매개변수 (Parameters)
- base — 부동소수점 또는 정수 값의 밑
- exp — 부동소수점 또는 정수 값의 지수
반환값 (Return value)
오류가 없다면 base를 exp로 올린 값(base^exp)을 반환해요.
도메인 오류가 발생하면 구현 정의 값을 반환해요 (NaN 지원 시 NaN).
극 오류 또는 오버플로로 인한 범위 오류가 발생하면 ±HUGE_VAL, ±HUGE_VALF, 또는 ±HUGE_VALL을 반환해요.
언더플로로 인한 범위 오류가 발생하면 (반올림 후의) 올바른 결과를 반환해요.
오류 처리 (Error handling)
오류는 math_errhandling에 지정된 대로 보고돼요.
base가 유한하고 음수이고 exp가 유한하고 정수가 아니면 도메인 오류가 발생하고 범위 오류가 발생할 수 있어요.
base가 0이고 exp가 0이면 도메인 오류가 발생할 수 있어요.
base가 0이고 exp가 음수이면 극 오류가 발생할 수 있어요.
구현이 IEEE 부동소수점 연산(IEC 60559)을 지원한다면:
- base가 ±0이고 exp가 양의 홀수 정수이면 결과는 ±0이에요.
- base가 ±0이고 exp가 양의 짝수 정수이면 결과는 +0이에요.
- base가 +1이면 (exp가 NaN이어도) 결과는 +1이에요.
- base가 NaN이면 결과는 NaN이에요.
- exp가 ±0이면 (base가 NaN이어도) 결과는 +1이에요.
참고 (Notes)
IEEE 호환 타입 double의 경우 std::pow(0.0, negative)는 +∞를 주고 FE_DIVBYZERO를 발생시킬 수 있어요.
추가 오버로드는 정확히 (A) 형태로 제공될 필요는 없어요.
예제 (Example)
이 코드를 실행해 봐요.
#include <cmath>
#include <iostream>
int main()
{
std::cout << "pow(2, 10) = " << std::pow(2, 10) << '\n'
<< "pow(2, 0.5) = " << std::pow(2, 0.5) << '\n'
<< "pow(2, -1) = " << std::pow(2, -1) << '\n';
}