exp в C/C++: вычисляем экспоненту

👋 Привет! В этой статье мы поговорим о функции exp. Эта функция позволяет нам вычислить экспоненту числа в C/C++. Сначала мы посмотрим как использовать эту функцию на примере, а потом попробуем реализовать ее сами. Также мы разберемся чем отличается exp от expl и expf. В конце статьи вы найдете упражнения для закрепления материала.

Иллюстрация exp

Как получить экспоненту числа в C/C++

Для того, чтобы вычислить экспоненту числа в C/C++, мы можем воспользоваться встроенной функцией exp. Эта функция доступна нам после подключения файла <math.h>. В C++ можно подключить <cmath>. Вот как выглядит прототип этой функции:

double exp (double x);
  • Единственным аргументом функция принимает число, для которого нужно вычислить экспоненту.
  • Функция возвращает экспоненту переданного ей аргумента.

Давайте посмотрим на пример:

#include <cmath>
#include <iostream>

using namespace std;

int main() {
  cout << "exp(1) = " << exp(1) << endl;
  cout << "exp(2) = " << exp(2) << endl;
  cout << "exp(10) = " << exp(10) << endl;
  cout << "exp(0) = " << exp(0) << endl;
  cout << "exp(0.25) = " << exp(0.25) << endl;
  cout << "exp(-2) = " << exp(-2) << endl;
  cout << "exp(-4.567) = " << exp(-4.567) << endl;

  return 0;
}

Вывод программы:

exp(1) = 2.71828
exp(2) = 7.38906
exp(10) = 22026.5
exp(0) = 1
exp(0.25) = 1.28403
exp(-2) = 0.135335
exp(-4.567) = 0.0103891

Какое значение будет выведено на экран после выполнения следующего кода?

#include <cmath>
#include <iostream>

using namespace std;

int main() {
  double x = 2.5;
  cout << exp(x + 1) / exp(x) << endl;
  return 0;
}
2.71828
3.5
7.38906
1.0

Как реализовать exp самому

Для вычисления экспоненты самостоятельно мы воспользуемся рядом Тейлора. Экспонента разложенная в ряд Тейлора имеет следующий вид:

Ряд Тейлора для exp

Программа:

#include <cmath>
#include <iostream>

using namespace std;

// Функция для вычисления факториала числа
double factorial(int n) {
  if (n == 0) return 1.0;
  double result = 1.0;
  for (int i = 1; i <= n; ++i) {
    result *= i;
  }
  return result;
}

// Функция для вычисления e^x с использованием ряда Тейлора
double my_exp(double x, int num_terms = 20) {
  double result = 1.0;  // Начнем с первого члена ряда Тейлора (1)

  for (int n = 1; n <= num_terms; ++n) {
    result += pow(x, n) / factorial(n);
  }

  return result;
}

int main() {
  cout << "my_exp(1) = " << my_exp(1) << endl;
  cout << "my_exp(2) = " << my_exp(2) << endl;
  cout << "my_exp(10) = " << my_exp(10) << endl;
  cout << "my_exp(0) = " << my_exp(0) << endl;
  cout << "my_exp(0.25) = " << my_exp(0.25) << endl;
  cout << "my_exp(-2) = " << my_exp(-2) << endl;
  cout << "my_exp(-4.567) = " << my_exp(-4.567) << endl;

  return 0;
}

Вывод:

my_exp(1) = 2.71828
my_exp(2) = 7.38906
my_exp(10) = 21991.5
my_exp(0) = 1
my_exp(0.25) = 1.28403
my_exp(-2) = 0.135335
my_exp(-4.567) = 0.0103902

В программе выше мы вычисляем двадцать элементов ряда. Количество итераций можно изменить как в большую, так и в меньшую сторону, передав второй аргумент num_terms (по умолчанию двадцать). Все зависит от того, какая точность вам нужна.

Функции expl и expf

Функции expl и expf, как и exp, вычисляют экспоненту числа. Разница только в том, что они работают с вещественными числами long double (expl) и float (expf). Давайте посмотрим на пример:

#include <cmath>
#include <iostream>

using namespace std;

int main() {
  cout << "expl(234) = " << expl(234) << endl;
  cout << "exp (234) = " << exp(234) << endl;
  cout << "expf(234) = " << expf(234) << endl;

  return 0;
}

Вывод:

expl(234) = 4.21608e+101
exp (234) = 4.21608e+101
expf(234) = inf

Как вы можете видеть, они возвращают одно и то же число, просто другого типа. В случае с expf, число переполнилось и мы получили inf.

Упражнения

  1. Использование exp, expl и expf:
    Напишите программу на C++, которая запрашивает у пользователя число и тип числа (double, long double, float), затем вычисляет экспоненту этого числа используя соответствующую функцию (exp, expl, expf) и выводит результат. Ваша программа должна также выводить исходное число пользователя.

  2. Сравнение exp и my_exp:
    Используя предоставленный в статье пример, сравните результаты работы стандартной функции exp и вашей версии функции my_exp для различных чисел. Напишите программу, которая демонстрирует различия в результатах и выводит их на экран.

  3. Использование expf с большими числами:
    Напишите программу, которая демонстрирует переполнение при использовании функции expf с большими числами. В вашей программе должны быть использованы функции exp, expl, и expf, и результаты их работы должны выводиться на экран.

Обсуждение