C++ で STL の指数関数を使用する

胡金庫 2023年10月12日
  1. std::exp 関数を使用して、オイラーの数の累乗を計算する
  2. std::exp2 関数を使用して、2 の累乗を計算する
  3. std::pow 関数を使用して、指定された数の累乗を計算する
  4. std::log 関数を使用して、指定された数の自然対数を計算する
C++ で STL の指数関数を使用する

この記事では、C++ で指数を計算するための STL 関数について説明します。

std::exp 関数を使用して、オイラーの数の累乗を計算する

std::exp 関数は、多くの一般的な数学関数とともに、<cmath> ヘッダーの一部です。前者は、与えられた累乗で累乗されたオイラーの数を計算します。これは、唯一の引数として渡されます。

std::exp 関数には、floatdoublelong double、さらには整数型に対して複数のオーバーロードがありますが、後者は依然として double 浮動小数点値を返します。オーバーフローが発生した場合、次のいずれかの値が+HUGE_VAL+HUGE_VALF、または+HUGE_VALL を返します。

+-0+-INFINITYNaN などのいくつかの引数には特別な戻り値があることに注意してください。これらのすべてのケースは、次のサンプルコードに示されています。

#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+-INFINITYNaN などの引数に対して同様の特別な値があることに注意してください。

#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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Math