pow, powf, powl
来自 cppreference.cn
在头文件 <math.h> 中定义 |
||
float powf( float base, float exponent ); |
(1) | (自 C99 起) |
double pow( double base, double exponent ); |
(2) | |
long double powl( long double base, long double exponent ); |
(3) | (自 C99 起) |
在头文件 <tgmath.h> 中定义 |
||
#define pow( base, exponent ) |
(4) | (自 C99 起) |
1-3) 计算 base 的 exponent 次幂的值。
4) 类型泛型宏:如果任何参数的类型为 long double,则调用
powl
。否则,如果任何参数具有整数类型或类型为 double,则调用 pow
。否则,调用 powf
。如果至少有一个参数是复数或虚数,则此宏会调用相应的复数函数(cpowf、cpow、cpowl)。目录 |
[edit] 参数
base | - | 底数,浮点值 |
exponent | - | 指数,浮点值 |
[edit] 返回值
如果没有错误发生,则返回 base 的 exponent 次幂(baseexponent
)。
如果发生域错误,则返回实现定义的值(如果支持,则为 NaN)。
如果由于上溢发生极点错误或范围错误,则返回 ±HUGE_VAL、±HUGE_VALF
或 ±HUGE_VALL
。
如果由于下溢发生范围错误,则返回正确的结果(舍入后)。
[edit] 错误处理
错误按照 math_errhandling
中的规定报告。
如果 base 是有限且为负数,且 exponent 是有限且非整数,则会发生域错误,并且可能发生范围错误。
如果 base 为零且 exponent 为零,则可能发生域错误。
如果 base 为零且 exponent 为负数,则可能发生域错误或极点错误。
如果实现支持 IEEE 浮点算术 (IEC 60559),
- pow(+0, exponent),其中 exponent 是负奇数整数,返回
+∞
并引发 FE_DIVBYZERO - pow(-0, exponent),其中 exponent 是负奇数整数,返回
-∞
并引发 FE_DIVBYZERO - pow(±0, exponent),其中 exponent 是负数、有限,并且是偶数整数或非整数,返回 +∞ 并引发 FE_DIVBYZERO
- pow(±0, -∞) 返回 +∞ 并且可能引发 FE_DIVBYZERO(直到 C23)
- pow(+0, exponent),其中 exponent 是正奇数整数,返回 +0
- pow(-0, exponent),其中 exponent 是正奇数整数,返回 -0
- pow(±0, exponent),其中 exponent 是正非整数或正偶数整数,返回 +0
- pow(-1, ±∞) 返回 1
- pow(+1, exponent) 对于任何 exponent 返回 1,即使 exponent 是
NaN
- pow(base, ±0) 对于任何 base 返回 1,即使 base 是
NaN
- pow(base, exponent) 如果 base 是有限且为负数,且 exponent 是有限且非整数,则返回
NaN
并引发 FE_INVALID。 - pow(base, -∞) 对于任何
|base|<1
返回 +∞ - pow(base, -∞) 对于任何
|base|>1
返回 +0 - pow(base, +∞) 对于任何
|base|<1
返回 +0 - pow(base, +∞) 对于任何
|base|>1
返回 +∞ - pow(-∞, exponent) 如果 exponent 是负奇数整数,则返回 -0
- pow(-∞, exponent) 如果 exponent 是负非整数或负偶数整数,则返回 +0
- pow(-∞, exponent) 如果 exponent 是正奇数整数,则返回 -∞
- pow(-∞, exponent) 如果 exponent 是正非整数或正偶数整数,则返回 +∞
- pow(+∞, exponent) 对于任何负数 exponent 返回 +0
- pow(+∞, exponent) 对于任何正数 exponent 返回 +∞
- 除非另有说明,否则如果任何参数是 NaN,则返回 NaN。
[edit] 注解
虽然 pow
不能用于获取负数的根,但为 exponent
为 1 / 3 的常见情况提供了 cbrt。
[edit] 示例
运行此代码
#include <errno.h> #include <fenv.h> #include <math.h> #include <stdio.h> // #pragma STDC FENV_ACCESS ON int main(void) { // typical usage printf("pow(2, 10) = %f\n", pow(2, 10)); printf("pow(2, 0.5) = %f\n", pow(2, 0.5)); printf("pow(-2, -3) = %f\n", pow(-2, -3)); // special values printf("pow(-1, NAN) = %f\n", pow(-1, NAN)); printf("pow(+1, NAN) = %f\n", pow(+1, NAN)); printf("pow(INFINITY, 2) = %f\n", pow(INFINITY, 2)); printf("pow(INFINITY, -1) = %f\n", pow(INFINITY, -1)); // error handling errno = 0; feclearexcept(FE_ALL_EXCEPT); printf("pow(-1, 1/3) = %f\n", pow(-1, 1.0 / 3)); if (errno == EDOM) perror(" errno == EDOM"); if (fetestexcept(FE_INVALID)) puts(" FE_INVALID raised"); feclearexcept(FE_ALL_EXCEPT); printf("pow(-0, -3) = %f\n", pow(-0.0, -3)); if (fetestexcept(FE_DIVBYZERO)) puts(" FE_DIVBYZERO raised"); }
可能的输出
pow(2, 10) = 1024.000000 pow(2, 0.5) = 1.414214 pow(-2, -3) = -0.125000 pow(-1, NAN) = nan pow(+1, NAN) = 1.000000 pow(INFINITY, 2) = inf pow(INFINITY, -1) = 0.000000 pow(-1, 1/3) = -nan errno == EDOM: Numerical argument out of domain FE_INVALID raised pow(-0, -3) = -inf FE_DIVBYZERO raised
[edit] 参考文献
- C23 标准 (ISO/IEC 9899:2024)
- 7.12.7.5 pow 函数
- 7.27 类型泛型数学 <tgmath.h>
- F.10.4.5 pow 函数 (p: 524-525)
- C17 标准 (ISO/IEC 9899:2018)
- 7.12.7.4 pow 函数 (p: 248-249)
- 7.25 类型泛型数学 <tgmath.h> (p: 373-375)
- F.10.4.4 pow 函数 (p: 524-525)
- C11 标准 (ISO/IEC 9899:2011)
- 7.12.7.4 pow 函数 (p: 248-249)
- 7.25 类型泛型数学 <tgmath.h> (p: 373-375)
- F.10.4.4 pow 函数 (p: 524-525)
- C99 标准 (ISO/IEC 9899:1999)
- 7.12.7.4 pow 函数 (p: 229)
- 7.22 类型泛型数学 <tgmath.h> (p: 335-337)
- F.9.4.4 pow 函数 (p: 461)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 4.5.5.1 pow 函数
[edit] 参见
(C99)(C99) |
计算平方根 (√x) (函数) |
(C99)(C99)(C99) |
计算立方根 (3√x) (函数) |
(C99)(C99)(C99) |
计算两个给定数字平方和的平方根 (√x2 +y2 ) (函数) |
(C99)(C99)(C99) |
计算复数幂函数 (函数) |
C++ 文档,关于 pow
|