常用数学函数
计算一个数的给定次幂 (xy)
std::pow,
std::powf,
std::powl
定义于头文件 | ||
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 起) |
定义于头文件 | ||
#define pow( base, exponent ) | (4) | (C99 起) |
1-3) 计算 base
的 exponent
次幂。
4) 泛型宏:若任何参数拥有 long double 类型,则调用 powl
。否则,若任何参数拥有整数类型或 double 类型,则调用 pow
。否则调用 powf
。若至少一个参数为复数或序数,则宏调用对应的复函数( cpowf 、 cpow 、 cpowl )。
参数
base | - | 作为底的浮点值 |
exponent | - | 作为指数的浮点值 |
返回值
若不出现错误,则返回 base
的 exponent
次幂( baseexponent
)。
若出现定义域错误,则返回实现定义值(支持的平台上为 NaN )。
若出现极点错误或上溢所致的值域错误,则返回 ±HUGE_VAL
、 ±HUGE_VALF
或 ±HUGE_VALL
。
若出现下溢所致的值域错误,则返回(舍入后的)正确结果。
错误处理
报告 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 (C2x 前)
- pow(+0, exponent) ,其中
exponent
为正奇数,返回 +0 - pow(-0, exponent) ,其中
exponent
为正奇数,返回 -0 - pow(±0, exponent) ,其中
exponent
为正非整数或正偶数,返回 +0 - pow(-1, ±∞) returns
1
- pow(+1, exponent) 对于任何
exponent
返回1
,即使exponent
为NaN
- pow(base, ±0) 对于任何
base
返回1
,即使base
为NaN
- pow(base, exponent) 返回
NaN
并引发 FE_INVALID ,若base
为有限负数且exponent
为有限非整数。 - pow(base, -∞) 对任何
|base|<1
返回 +∞ - pow(base, -∞) 对任何
|base|>1
返回 +0 - pow(base, +∞) 对任何
|base|<1
返回 +0 - pow(base, +∞) 对任何
|base|>1
返回 +∞ - pow(-∞, exponent) 返回 -0 ,若
exponent
为负奇整数 - pow(-∞, exponent) 返回 +0 ,若
exponent
为负非整数或负偶数 - pow(-∞, exponent) 返回 -∞ ,若
exponent
为正奇整数 - pow(-∞, exponent) 返回 +∞ ,若
exponent
为正非整数或正偶数 - pow(+∞, exponent) 对任何
exponent
返回 +0 - pow(+∞, exponent) 对任何
exponent
返回 +∞ - 除了指定于上处,若任何参数为 NaN ,则返回 NaN
注意
尽管 pow
不能获得负数的开方根,也为 exponent
为 1/3 的常用情况提供了 cbrt 。
调用示例
#include <iostream>
#include <cstdlib>
#include <typeinfo>
#include <cinttypes>
#include <cmath>
int main()
{
//1-3) 计算 base 的 exponent 次幂。
const float fNumber = 0.1314;
const float fExponent = 2;
std::cout << "typeid(float).name(): " << typeid(float).name() << std::endl;
for (int i = 0; i < 100; i += 10)
{
std::cout << "std::pow(" << fNumber + i << "," << fExponent << "): "
<< std::pow(fNumber + i, fExponent) << std::endl;
}
std::cout << std::endl;
for (int i = 0; i < 100; i += 10)
{
std::cout << "std::pow(" << - fNumber + i << "," << fExponent << "): "
<< std::pow(- fNumber + i, fExponent) << std::endl;
}
std::cout << std::endl;
const double dNumber = 0.01314;
const double dExponent = 2.2;
std::cout << "typeid(double).name(): " << typeid(double).name() << std::endl;
for (int i = 0; i < 100; i += 10)
{
std::cout << "std::pow(" << dNumber + i << "," << dExponent << "): "
<< std::pow(dNumber + i, dExponent) << std::endl;
}
std::cout << std::endl;
for (int i = 0; i < 100; i += 10)
{
std::cout << "std::pow(" << - dNumber + i << "," << dExponent << "): "
<< std::pow(- dNumber + i, dExponent) << std::endl;
}
std::cout << std::endl;
const long double ldNumber = 0.1314;
const long double ldExponent = 1.13;
std::cout << "typeid(long double).name(): " << typeid(long double).name() << std::endl;
for (int i = 0; i < 100; i += 10)
{
std::cout << "std::pow(" << ldNumber + i << "," << ldExponent << "): "
<< std::pow(ldNumber + i, ldExponent) << std::endl;
}
std::cout << std::endl;
for (int i = 0; i < 100; i += 10)
{
std::cout << "std::pow(" << - ldNumber + i << "," << ldExponent << "): "
<< std::pow(- ldNumber + i, ldExponent) << std::endl;
}
std::cout << std::endl;
return 0;
}
输出
typeid(float).name(): f
std::pow(0.1314,2): 0.017266
std::pow(10.1314,2): 102.645
std::pow(20.1314,2): 405.273
std::pow(30.1314,2): 907.901
std::pow(40.1314,2): 1610.53
std::pow(50.1314,2): 2513.16
std::pow(60.1314,2): 3615.79
std::pow(70.1314,2): 4918.41
std::pow(80.1314,2): 6421.04
std::pow(90.1314,2): 8123.67
std::pow(-0.1314,2): 0.017266
std::pow(9.8686,2): 97.3893
std::pow(19.8686,2): 394.761
std::pow(29.8686,2): 892.133
std::pow(39.8686,2): 1589.51
std::pow(49.8686,2): 2486.88
std::pow(59.8686,2): 3584.25
std::pow(69.8686,2): 4881.62
std::pow(79.8686,2): 6378.99
std::pow(89.8686,2): 8076.37
typeid(double).name(): d
std::pow(0.01314,2.2): 7.25955e-005
std::pow(10.0131,2.2): 158.948
std::pow(20.0131,2.2): 729.279
std::pow(30.0131,2.2): 1778.63
std::pow(40.0131,2.2): 3348.47
std::pow(50.0131,2.2): 5469.97
std::pow(60.0131,2.2): 8168.49
std::pow(70.0131,2.2): 11465.6
std::pow(80.0131,2.2): 15379.9
std::pow(90.0131,2.2): 19928.4
std::pow(-0.01314,2.2): nan
std::pow(9.98686,2.2): 158.032
std::pow(19.9869,2.2): 727.174
std::pow(29.9869,2.2): 1775.2
std::pow(39.9869,2.2): 3343.63
std::pow(49.9869,2.2): 5463.65
std::pow(59.9869,2.2): 8160.63
std::pow(69.9869,2.2): 11456.1
std::pow(79.9869,2.2): 15368.8
std::pow(89.9869,2.2): 19915.6
typeid(long double).name(): e
std::pow(0.1314,1.13): 0.100928
std::pow(10.1314,1.13): 13.6901
std::pow(20.1314,1.13): 29.7425
std::pow(30.1314,1.13): 46.9129
std::pow(40.1314,1.13): 64.8541
std::pow(50.1314,1.13): 83.3919
std::pow(60.1314,1.13): 102.42
std::pow(70.1314,1.13): 121.866
std::pow(80.1314,1.13): 141.676
std::pow(90.1314,1.13): 161.812
std::pow(-0.1314,1.13): nan
std::pow(9.8686,1.13): 13.2895
std::pow(19.8686,1.13): 29.3041
std::pow(29.8686,1.13): 46.4508
std::pow(39.8686,1.13): 64.3744
std::pow(49.8686,1.13): 82.8981
std::pow(59.8686,1.13): 101.914
std::pow(69.8686,1.13): 121.35
std::pow(79.8686,1.13): 141.151
std::pow(89.8686,1.13): 161.279