命名空间
变体
操作

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

来自 cppreference.com
< 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)
/* 浮点类型 */

            pow ( /* 浮点类型 */ base,

                  /* 浮点类型 */ exp )
(自 C++23 起)
(自 C++26 起为 constexpr)
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 起)
(自 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 >

/* 通用浮点类型 */

            pow ( Arithmetic1 base, Arithmetic2 exp );
(A) (自 C++26 起为 constexpr)
1-4) 计算 base 乘以 exp 次幂的值。
A) 为所有其他算术类型组合提供了其他重载。
(自 C++11 起)

内容

[编辑] 参数

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

[编辑] 返回值

如果未发生错误,则返回 base 乘以 exp 次幂的值 (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) 返回 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) 如果 exp 是一个负奇数,则返回 -0。
  • pow(-∞, exp) 如果 exp 是一个负非整数或负偶数,则返回 +0。
  • pow(-∞, exp) 如果 exp 是一个正奇数,则返回 -∞。
  • pow(-∞, exp) 如果 exp 是一个正非整数或正偶数,则返回 +∞。
  • pow(+∞, exp) 对于任何负数 exp 都返回 +0。
  • pow(+∞, exp) 对于任何正数 exp 都返回 +∞。
  • 除了上面指定的以外,如果任何参数为 NaN,则返回 NaN。

[edit] 注释

C++98 在 C pow() 的基础上添加了 exp 类型为 int 的重载,并且 std::pow(float, int) 的返回值类型为 float。但是,C++11 中引入的额外重载指定 std::pow(float, int) 应该返回 doubleLWG issue 550 被提出用于解决此冲突,解决方法是移除额外的 int exp 重载。

虽然 std::pow 不能用于获取负数的根,但 std::cbrt 用于 exp 为 1/3 的常见情况。

额外的重载不需要完全按照 (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 起)

[edit] 示例

#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

[edit] 另请参阅

(C++11)(C++11)
计算平方根 (x)
(函数) [edit]
(C++11)(C++11)(C++11)
计算立方根 (3x)
(函数) [edit]
(C++11)(C++11)(C++11)
计算两个 或三个(自 C++17 起) 给定数字的平方和的平方根 (x2
+y2
), (x2
+y2
+z2
)
(自 C++17 起)

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