命名空间
变体
操作

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

来自 cppreference.cn
< cpp‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本运算
(C++11)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
指数函数
(C++11)
(C++11)

(C++11)
(C++11)
幂函数
(C++11)
(C++11)
pow
三角函数
双曲函数
(C++11)
(C++11)
(C++11)

误差和伽玛函数
(C++11)
(C++11)
(C++11)
(C++11)
最接近整数的浮点运算
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
浮点数操作函数
(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)
分类和比较
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
类型
(C++11)
(C++11)
(C++11)
宏常量
分类
(C++11)(C++11)(C++11)(C++11)(C++11)


 
定义于头文件 <cmath>
(1)
float       pow ( float base, float exp );

double      pow ( double base, double exp );

long double pow ( long double base, long double exp );
(直到 C++23)
/* floating-point-type */

            pow ( /* floating-point-type */ base,

                  /* floating-point-type */ exp )
(自 C++23 起)
(constexpr 自 C++26 起)
float       pow ( float base, int exp );

double      pow ( double base, int exp );

long double pow ( long double base, int exp );
(2) (直到 C++11)
float       powf( float base, float exp );
(3) (自 C++11 起)
(constexpr 自 C++26 起)
long double powl( long double base, long double exp );
(4) (自 C++11 起)
(constexpr 自 C++26 起)
附加重载 (自 C++11 起)
定义于头文件 <cmath>
template< class Arithmetic1, class Arithmetic2 >

/* common-floating-point-type */

            pow ( Arithmetic1 base, Arithmetic2 exp );
(A) (constexpr 自 C++26 起)
1-4) 计算 baseexp 次幂的值。 库为所有 cv 非限定浮点类型提供了 std::pow 的重载,作为参数 baseexp 的类型。(自 C++23 起)
A) 为算术类型的其他所有组合提供了附加重载。
(自 C++11 起)

内容

[编辑] 参数

base - 作为浮点数或整数值的底数
exp - 作为浮点数或整数值的指数

[编辑] 返回值

如果没有错误发生,则返回 baseexp 次幂 (baseexp
)。

如果发生域错误,则返回实现定义的某个值(如果支持,则为 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) 如果 base 是有限且为负数,且 exp 是有限且非整数,则返回 NaN 并引发 FE_INVALID
  • pow(base, -) 对于任何 |base| < 1 返回 +∞。
  • pow(base, -) 对于任何 |base| > 1 返回 +0。
  • pow(base, +) 对于任何 |base| < 1 返回 +0。
  • pow(base, +) 对于任何 |base| > 1 返回 +∞。
  • pow(-∞, exp) 如果 exp 是负奇整数,则返回 -0。
  • pow(-∞, exp) 如果 exp 是负非整数或负偶整数,则返回 +0。
  • 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) 应返回 doubleLWG 问题 550 被提出以解决此冲突,解决方案是删除额外的 int exp 重载。

尽管 std::pow 不能用于获得负数的根,但为 exp 为 1/3 的常见情况提供了 std::cbrt

不需要完全按照 (A) 的形式提供附加重载。它们只需要足以确保对于它们的第一个参数 num1 和第二个参数 num2

  • 如果 num1num2 具有类型 long double,则 std::pow(num1, num2) 具有与 std::pow(static_cast<long double>(num1),
             static_cast<long double>(num2))
    相同的效果。
  • 否则,如果 num1 和/或 num2 具有类型 double 或整数类型,则 std::pow(num1, num2) 具有与 std::pow(static_cast<double>(num1),
             static_cast<double>(num2))
    相同的效果。
  • 否则,如果 num1num2 具有类型 float,则 std::pow(num1, num2) 具有与 std::pow(static_cast<float>(num1),
             static_cast<float>(num2))
    相同的效果。
(直到 C++23)

如果 num1num2 具有算术类型,则 std::pow(num1, num2) 具有与 std::pow(static_cast</*common-floating-point-type*/>(num1),
         static_cast</*common-floating-point-type*/>(num2))
相同的效果,其中 /*common-floating-point-type*/ 是浮点类型,在 浮点转换等级 中具有最高的等级,并且在 浮点转换子等级 中在 num1num2 类型之间具有最高的等级,整数类型的参数被认为具有与 double 相同的浮点转换等级。

如果没有具有最高等级和子等级的此类浮点类型存在,则 重载解析 不会导致来自所提供的重载的可用候选者。

(自 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)
计算立方根 (3x)
(函数) [编辑]
(C++11)(C++11)(C++11)
计算斜边 x2
+y2
x2
+y2
+z2
(自 C++17 起)

(函数) [编辑]
复数幂,一个或两个参数可以是复数
(函数模板) [编辑]
将函数 std::pow 应用于两个 valarray 或一个 valarray 和一个值
(函数模板) [编辑]
C 文档 关于 pow