std::pow, std::powf, std::powl
定義於標頭檔案 <cmath> |
||
(1) | ||
float pow ( float base, float exp ); double pow ( double base, double exp ); |
(直至 C++23) | |
/* 浮點型別 */ pow ( /* 浮點型別 */ base, |
(C++23 起) (C++26 起為 constexpr) |
|
float pow ( float base, int exp ); double pow ( double base, int exp ); |
(2) | (C++11 前) |
float powf( float base, float exp ); |
(3) | (C++11 起) (C++26 起為 constexpr) |
long double powl( long double base, long double exp ); |
(4) | (C++11 起) (C++26 起為 constexpr) |
額外過載 (自 C++11 起) |
||
定義於標頭檔案 <cmath> |
||
template< class Arithmetic1, class Arithmetic2 > /* common-floating-point-type */ |
(A) | (C++26 起為 constexpr) |
std::pow
的過載,作為引數 base 和 exp 的型別。(自 C++23 起)
A) 為所有其他算術型別組合提供了附加過載。
|
(C++11 起) |
目錄 |
[編輯] 引數
base | - | 底數,一個浮點或整數值 |
exp | - | 指數,一個浮點或整數值 |
[編輯] 返回值
如果未發生錯誤,則返回 base 的 exp 次冪 (baseexp
)。
如果發生域錯誤,則返回實現定義的值 (支援 NaN 時返回 NaN)。
如果發生極點錯誤或因溢位導致的範圍錯誤,則返回 ±HUGE_VAL、±HUGE_VALF
或 ±HUGE_VALL
。
如果因下溢發生範圍錯誤,則返回正確結果(舍入後)。
[編輯] 錯誤處理
錯誤按 math_errhandling 指定的方式報告。
如果 base 是有限負數且 exp 是有限非整數,則發生域錯誤,並可能發生範圍錯誤。
如果 base 為零且 exp 為零,則可能發生域錯誤。
如果 base 為零且 exp 為負數,則可能發生域錯誤或極點錯誤。
如果實現支援 IEEE 浮點運算 (IEC 60559),
- pow(+0, exp),其中 exp 是負奇整數,返回 +∞ 並引發 FE_DIVBYZERO。
- pow(-0, exp),其中 exp 是負奇整數,返回 -∞ 並引發 FE_DIVBYZERO。
- pow(±0, exp),其中 exp 是負數、有限,並且是偶數整數或非整數,返回 +∞ 並引發 FE_DIVBYZERO。
- pow(±0, -∞) 返回 +∞ 並可能引發 FE_DIVBYZERO。
- pow(+0, exp),其中 exp 是正奇整數,返回 +0。
- pow(-0, exp),其中 exp 是正奇整數,返回 -0。
- pow(±0, exp),其中 exp 是正非整數或正偶整數,返回 +0。
- pow(-1, ±∞) 返回 1。
- pow(+1, exp) 對任何 exp 返回 1,即使 exp 是 NaN。
- pow(base, ±0) 對任何 base 返回 1,即使 base 是 NaN。
- pow(base, exp) 返回 NaN 並引發 FE_INVALID,如果 base 是有限負數且 exp 是有限非整數。
- pow(base, -∞) 對於任何
|base| < 1
返回 +∞。 - pow(base, -∞) 對於任何
|base| > 1
返回 +0。 - pow(base, +∞) 對於任何
|base| < 1
返回 +0。 - pow(base, +∞) 對於任何
|base| > 1
返回 +∞。 - pow(-∞, exp) 返回 -0,如果 exp 是負奇整數。
- pow(-∞, exp) 返回 +0,如果 exp 是負非整數或負偶整數。
- pow(-∞, exp) 返回 -∞,如果 exp 是正奇整數。
- pow(-∞, exp) 返回 +∞,如果 exp 是正非整數或正偶整數。
- pow(+∞, exp) 對任何負 exp 返回 +0。
- pow(+∞, exp) 對任何正 exp 返回 +∞。
- 除上述指定情況外,如果任何引數為 NaN,則返回 NaN。
[編輯] 註記
C++98 在 C pow() 的基礎上添加了 exp 型別為 int 的過載,且 std::pow(float, int) 的返回型別為 float。然而,C++11 引入的額外過載指定 std::pow(float, int) 應該返回 double。LWG issue 550 旨在解決此衝突,解決方案是移除額外的 int exp 過載。
儘管 std::pow
不能用於獲取負數的根,但 std::cbrt 提供了當 exp 為 1/3 時的常見情況。
額外過載不要求完全按 (A) 提供。它們只需足以確保對於其第一引數 num1 和第二引數 num2
|
(直至 C++23) |
如果 num1 和 num2 具有算術型別,則 std::pow(num1, num2) 具有與 std::pow(static_cast</*common-floating-point-type*/>(num1), 如果不存在具有最高等級和次等級的浮點型別,則過載決議不會從提供的過載中產生可用的候選函式。 |
(C++23 起) |
[編輯] 示例
#include <cerrno> #include <cfenv> #include <cmath> #include <cstring> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { // typical usage std::cout << "pow(2, 10) = " << std::pow(2, 10) << '\n' << "pow(2, 0.5) = " << std::pow(2, 0.5) << '\n' << "pow(-2, -3) = " << std::pow(-2, -3) << '\n'; // special values std::cout << "pow(-1, NAN) = " << std::pow(-1, NAN) << '\n' << "pow(+1, NAN) = " << std::pow(+1, NAN) << '\n' << "pow(INFINITY, 2) = " << std::pow(INFINITY, 2) << '\n' << "pow(INFINITY, -1) = " << std::pow(INFINITY, -1) << '\n'; // error handling errno = 0; std::feclearexcept(FE_ALL_EXCEPT); std::cout << "pow(-1, 1/3) = " << std::pow(-1, 1.0 / 3) << '\n'; if (errno == EDOM) std::cout << " errno == EDOM " << std::strerror(errno) << '\n'; if (std::fetestexcept(FE_INVALID)) std::cout << " FE_INVALID raised\n"; std::feclearexcept(FE_ALL_EXCEPT); std::cout << "pow(-0, -3) = " << std::pow(-0.0, -3) << '\n'; if (std::fetestexcept(FE_DIVBYZERO)) std::cout << " FE_DIVBYZERO raised\n"; }
可能的輸出
pow(2, 10) = 1024 pow(2, 0.5) = 1.41421 pow(-2, -3) = -0.125 pow(-1, NAN) = nan pow(+1, NAN) = 1 pow(INFINITY, 2) = inf pow(INFINITY, -1) = 0 pow(-1, 1/3) = -nan errno == EDOM Numerical argument out of domain FE_INVALID raised pow(-0, -3) = -inf FE_DIVBYZERO raised
[編輯] 參閱
(C++11)(C++11) |
計算平方根(√x) (函式) |
(C++11)(C++11)(C++11) |
計算立方根(3√x) (函式) |
(C++11)(C++11)(C++11) |
計算斜邊 √x2 +y2 和 √x2 +y2 +z2 (自 C++17 起) (函式) |
複數冪,一個或兩個引數可以是複數 (函式模板) | |
將函式 std::pow 應用於兩個 valarray 或一個 valarray 和一個值 (函式模板) | |
C 文件 關於 pow
|