C++11标准模板(STL)- 常用数学函数 - 计算一个数的给定次幂 (xy)(std::pow, std::powf, std::powl)

常用数学函数

计算一个数的给定次幂 (xy)

std::pow, 
std::powf, 
std::powl

定义于头文件 <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) 计算 baseexponent 次幂。

4) 泛型宏:若任何参数拥有 long double 类型,则调用 powl 。否则,若任何参数拥有整数类型或 double 类型,则调用 pow 。否则调用 powf 。若至少一个参数为复数或序数,则宏调用对应的复函数( cpowf 、 cpow 、 cpowl )。

参数

base-作为底的浮点值
exponent-作为指数的浮点值

返回值

若不出现错误,则返回 baseexponent 次幂( 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 ,即使 exponentNaN
  • pow(base, ±0) 对于任何 base 返回 1 ,即使 baseNaN
  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值