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