Как рассчитать постоянную Эйлера или питание Эйлера в C++?
Я пытаюсь найти более "естественный" способ использовать число e в C/C++. Я сосредоточен на вычислении функции е^ п.
Я думаю, что "cmath", по умолчанию, не обеспечивает поддержку как (функции, так и константы). Однако можно включить константы, определенные компилятором, в этом случае M_E
, Это может быть сделано путем включения заявления #define _USE_MATH_DEFINES
,
С другой стороны, e можно определить как константу:
#define E 2.71828182845904523536;
или же
const double EULER = 2.71828182845904523536;
Сказал это. Какой самый "стандартный" способ приближения к этой математической константе? Это какая-то другая библиотека?
3 ответа
Если вы можете избежать использования символа препроцессора, вы должны. Это доставит вам неприятности, когда вы меньше всего этого ожидаете. E
скорее всего, будет переменной.
Предложенное решение:
#include <cmath>
const double EulerConstant = std::exp(1.0);
Преимущество вычисления константы вместо присваивания литерала с плавающей запятой состоит в том, что она будет давать результат с точностью, соответствующей точности double
тип данных для вашей конкретной реализации C++. И это исключает возможность внесения ошибки, случайно пропуская цифру.
Как показано выше, <cmath>
объявляет std::exp
так что вам не нужно кататься самостоятельно.
C++20 std::numbers::e
C++20 has also added an e
constant to the standard library: http://eel.is/c++draft/numbers
I expect the usage to be like:
#include <math>
#include <iostream>
int main() {
std::cout << std::numbers::e << std::endl;
}
I'll give it a try when support arrives to GCC, GCC 9.1.0 with g++-9 -std=c++2a
still doesn't support it.
The accepted proposal describes:
5.0. “Headers” [headers] In the table [tab:cpp.library.headers], a new header needs to be added.
[...]
namespace std { namespace math { template<typename T > inline constexpr T e_v = unspecified; inline constexpr double e = e_v<double>;
There is also a std::numbers::pi
of course:-) How to use the PI constant in C++
These constants use the C++14 variable template feature: C++14 Variable Templates: what is their purpose? Any usage example?
In earlier versions of the draft, the constant was under std::math::e
: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0631r7.pdf
Я столкнулся с этой школьной проблемой и решил, что вычисляю число Эйлера без cmath. Итак, нам нужно посчитать 1 + 1/1! + 1/2! + ... + 1 / п !.
Я использую рекурсивные функции, чтобы добиться этого (основное предназначено только для тестирования моего решения о е):
#include <iostream>
#include <iomanip>
using namespace std;
double Factorial(int n){ // Max n = 170
if(n==1) return 1;
else return n * Factorial(n-1);
}
double GetEuler(int n){
if(n == 0) return 1;
else return (1/Factorial(n) + GetEuler(n-1));
}
int main(){
int n;
double e;
e = GetEuler(170);
cout << setprecision(15) << e << endl;
return 0;
}
Выход: 2.71828182845905