在 C++ 中使用 STL 的指数函数

Jinku Hu 2023年1月30日 2021年10月2日
  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 <iostream>
#include <iomanip>
#include <cmath>

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 <iostream>
#include <iomanip>
#include <cmath>

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 <iostream>
#include <iomanip>
#include <cmath>

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 <iostream>
#include <iomanip>
#include <cmath>

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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相关文章 - C++ Math