C++ で STL の指数関数を使用する
- 
          
            std::exp関数を使用して、オイラーの数の累乗を計算する
- 
          
            std::exp2関数を使用して、2 の累乗を計算する
- 
          
            std::pow関数を使用して、指定された数の累乗を計算する
- 
          
            std::log関数を使用して、指定された数の自然対数を計算する
 
この記事では、C++ で指数を計算するための STL 関数について説明します。
std::exp 関数を使用して、オイラーの数の累乗を計算する
    
std::exp 関数は、多くの一般的な数学関数とともに、<cmath> ヘッダーの一部です。前者は、与えられた累乗で累乗されたオイラーの数を計算します。これは、唯一の引数として渡されます。
std::exp 関数には、float、double、long double、さらには整数型に対して複数のオーバーロードがありますが、後者は依然として double 浮動小数点値を返します。オーバーフローが発生した場合、次のいずれかの値が+HUGE_VAL、+HUGE_VALF、または+HUGE_VALL を返します。
+-0、+-INFINITY、NaN などのいくつかの引数には特別な戻り値があることに注意してください。これらのすべてのケースは、次のサンプルコードに示されています。
#include <cmath>
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
int main() {
  cout << "exp(1) = e¹ = " << std::setprecision(16) << std::exp(1) << '\n'
       << "exp(10)  = " << std::exp(10) << '\n'
       << "exp(100) = " << std::exp(100) << '\n';
  cout << "exp(-0) = " << std::exp(-0.0) << '\n'
       << "exp(+Inf) = " << std::exp(+INFINITY) << '\n'
       << "exp(NaN) = " << std::exp(NAN) << '\n'
       << "exp(-Inf) = " << std::exp(-INFINITY) << '\n';
  return EXIT_SUCCESS;
}
出力:
exp(1) = e¹ = 2.718281828459045
exp(10)  = 22026.46579480672
exp(100) = 2.688117141816136e+43
exp(-0) = 1
exp(+Inf) = inf
exp(NaN) = nan
exp(-Inf) = 0
std::exp2 関数を使用して、2 の累乗を計算する
一方、2 の累乗を計算するための std::exp2 関数があります。この関数のオーバーロードは浮動小数点値を返しますが、整数型も受け入れることができます。std::exp2 には、+-0、+-INFINITY、NaN などの引数に対して同様の特別な値があることに注意してください。
#include <cmath>
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
int main() {
  cout << "exp2(4) = " << std::exp2(4) << '\n'
       << "exp2(0.5) = " << std::exp2(0.5) << '\n'
       << "exp2(10) = " << std::exp2(10) << '\n';
  cout << "exp2(-0) = " << std::exp2(-0.0) << '\n'
       << "exp2(+Inf) = " << std::exp2(+INFINITY) << '\n'
       << "exp2(NaN) = " << std::exp2(NAN) << '\n'
       << "exp2(-Inf) = " << std::exp2(-INFINITY) << '\n';
  return EXIT_SUCCESS;
}
出力:
exp2(4) = 16
exp2(0.5) = 1.41421
exp2(10) = 1024
exp2(-0) = 1
exp2(+Inf) = inf
exp2(NaN) = nan
exp2(-Inf) = 0
std::pow 関数を使用して、指定された数の累乗を計算する
std::pow 関数は、指定された累乗の数値を計算するために使用されます。基数と累乗値の両方が、それぞれ最初と 2 番目の引数として指定されます。
std::pow には、浮動小数点型と整数値に対して複数のオーバーロードがありますが、後者は double 型にキャストされ、引数の一つが long double でもある場合には long double にも昇格できます。また、std::pow を使用して負の数の根を計算することはできないことに注意してください。
#include <cmath>
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
int main() {
  cout << "pow(2, 10) = " << std::pow(2, 10) << '\n'
       << "pow(10, 0.5) = " << std::pow(10, 0.5) << '\n'
       << "pow(-25, -2) = " << std::pow(-25, -2) << '\n';
  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';
  return EXIT_SUCCESS;
}
出力:
pow(2, 10) = 1024
pow(10, 0.5) = 3.16228
pow(-25, -2) = 0.0016
pow(-1, NAN) = nan
pow(+1, NAN) = 1
pow(INFINITY, 2) = inf
pow(INFINITY, -1) = 0
std::log 関数を使用して、指定された数の自然対数を計算する
std::log ファミリーの関数も <cmath> で提供され、与えられた数値のさまざまな対数を計算します。std::log 関数は自然対数を計算し、前の関数と同様に、浮動小数点型と整数型に対して複数のオーバーロードがあります。
#include <cmath>
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
int main() {
  cout << "log(10) = " << std::log(10) << '\n'
       << "log(100) = " << std::log(100) << '\n';
  cout << "log(1) = " << std::log(1) << '\n'
       << "log(+Inf) = " << std::log(INFINITY) << '\n';
  return EXIT_SUCCESS;
}
出力:
log(10) = 2.30259
log(100) = 4.60517
log(1) = 0
log(+Inf) = inf
