命名空间
变体
操作

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

来自 cppreference.cn
< cpp‎ | 数值‎ | 数学
 
 
 
常用数学函数
函数
基本操作
(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 >

/* common-floating-point-type */

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

目录

[编辑] 参数

base - 底数,一个浮点或整数值
exp - 指数,一个浮点或整数值

[编辑] 返回值

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

如果发生域错误,则返回实现定义的值 (支持 NaN 时返回 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) 返回 -0,如果 exp 是负奇整数。
  • pow(-∞, exp) 返回 +0,如果 exp 是负非整数或负偶整数。
  • 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 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 起)

[编辑] 示例

#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