在 C++ 中使用 STL 的指數函式

Jinku Hu 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 的冪

另一方面,我們有 std::exp2 函式來計算 2 的冪。此函式的過載返回浮點值,但也可以接受整數型別。請注意,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 函式用於計算數字的給定冪的值。基數和冪值分別指定為第一個和第二個引數。

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 函式計算給定數的自然對數

<cmath> 中還提供了 std::log 系列函式來計算給定數值的各種對數。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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Math