Как вычислить константу Эйлера или Euler, работающую на С++?

Я пытаюсь найти более "естественный" способ использовать число e в C/С++. Я сосредоточен на вычислении функции e ^ n.

Я думаю, что "cmath", по умолчанию, не обеспечивает поддержку как (функция, так и константа). Однако можно включить константы, определенные компилятором, в этом случае M_E. Это можно сделать, включив оператор #define _USE_MATH_DEFINES.

С другой стороны, e можно определить как константу:

#define E 2.71828182845904523536;

или

const double EULER = 2.71828182845904523536;

Сказал это. Какой из них является "стандартным" способом приблизиться к этой математической константе? Это какая-то другая библиотека?

Ответ 1

Если вы можете избежать использования символа препроцессора, вы должны. Это вызовет у вас проблемы, когда вы меньше всего этого ожидаете. E, вероятно, будет переменной.

Предлагаемое решение:

#include <cmath>
const double EulerConstant = std::exp(1.0);

Преимущество вычисления константы вместо назначения литерала с плавающей запятой заключается в том, что оно будет давать результат с точностью, которая соответствует точности типа данных double для вашей конкретной реализации на С++. И это исключает возможность введения ошибки, случайно пропуская цифру.

Как показано выше, <cmath> объявляет std::exp, поэтому вам не нужно откатывать свои собственные.

Ответ 2

C++ 20 std::numbers::e

C++ 20 также добавил константу e в стандартную библиотеку: http://eel.is/C++draft/numbers

Я ожидаю, что использование будет как:

#include <math>
#include <iostream>

int main() {
    std::cout << std::numbers::e << std::endl;
}

Я попробую, когда поддержка придет в GCC, GCC 9.1.0 с g++-9 -std=c++2a все еще не поддерживает его.

В принятом предложении описывается:

5.0. "Заголовки" [заголовки] В таблице [tab: cpp.library.headers] необходимо добавить новый заголовок.

[...]

namespace std {
namespace math { 
template<typename T > inline constexpr T e_v = unspecified;
inline constexpr double e = e_v<double>;

Существует также std::numbers::pi, конечно :-) Как использовать константу PI в C++

Эти константы используют функцию шаблона переменных C++ 14: C++ 14 Шаблоны переменных: какова их цель? Любой пример использования?

В более ранних версиях проекта константа находилась под std::math::e: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0631r7.pdf