名前空間
変種
操作

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

From cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
ヘッダー <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)
ヘッダー <cmath> で定義
template< class Arithmetic1, class Arithmetic2 >

/* 共通浮動小数点型 */

            pow ( Arithmetic1 base, Arithmetic2 exp );
(A) (C++26 以降 constexpr)
1-4) baseexp 乗した値を計算する。ライブラリは、パラメータ base および exp の型として、全てのcv修飾なし浮動小数点型に対して std::pow のオーバーロードを提供する。(C++23以降)
A) その他の算術型の組み合わせすべてに対して、追加のオーバーロードが提供されます。
(C++11以降)

目次

[編集] パラメータ

base - base: 浮動小数点数または整数値
exp - 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 が NaN の場合でも、任意の exp に対して 1 を返す。
  • pow(base, ±0) は、base が NaN の場合でも、任意の base に対して 1 を返す。
  • 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() に加えて、expint 型であるオーバーロードが追加され、std::pow(float, int) の戻り値の型は float であった。しかし、C++11で導入された追加のオーバーロードでは、std::pow(float, int)double を返すように指定されている。LWG issue 550 はこの競合を対象として提起され、その解決策は追加の int exp オーバーロードを削除することである。

std::pow は負の数の根を求めるのに使用できないが、std::cbrtexp が 1/3 の一般的なケースのために提供されている。

追加のオーバーロードは (A) とまったく同じように提供される必要はない。それらは、最初の引数 num1 と2番目の引数 num2 に対して以下を保証するのに十分である必要がある。

  • num1 または num2long double 型の場合、std::pow(num1, num2)std::pow(static_cast<long double>(num1),
             static_cast<long double>(num2))
    と同じ効果を持つ。
  • それ以外の場合、num1 および/または num2double 型または整数型の場合、std::pow(num1, num2)std::pow(static_cast<double>(num1),
             static_cast<double>(num2))
    と同じ効果を持つ。
  • それ以外の場合、num1 または num2float 型の場合、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</*共通浮動小数点型*/>(num1),
         static_cast</*共通浮動小数点型*/>(num2))
と同じ効果を持つ。ここで /*共通浮動小数点型*/ は、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 関数を2つのvalarray、またはvalarrayと値に適用する
(function template) [編集]
English 日本語 中文(简体) 中文(繁體)