C++ 如何计算欧拉常数或欧拉在C++;?

C++ 如何计算欧拉常数或欧拉在C++;?,c++,eulers-number,C++,Eulers Number,我试图找到更“自然”的方法在C/C++中使用数字e。我专注于计算函数e^n 我认为默认情况下,“cmath”不同时支持函数和常量。但是,它可以包括编译器定义的常量,在本例中是me。这可以通过包含语句#define\u USE\u MATH\u define来实现 另一方面,e可以定义为常数: #define E 2.71828182845904523536; 或 他这样说。哪一种是接近这个数学常数的最“标准”的方法?是否有其他库?如果可以避免使用预处理器符号,则应该使用。它会在你最意想不到的时

我试图找到更“自然”的方法在C/C++中使用数字e。我专注于计算函数e^n

我认为默认情况下,“cmath”不同时支持函数和常量。但是,它可以包括编译器定义的常量,在本例中是
me
。这可以通过包含语句
#define\u USE\u MATH\u define
来实现

另一方面,e可以定义为常数:

#define E 2.71828182845904523536;


他这样说。哪一种是接近这个数学常数的最“标准”的方法?是否有其他库?

如果可以避免使用预处理器符号,则应该使用。它会在你最意想不到的时候给你带来麻烦
E
很可能是一个变量

提议的解决办法:

#include <cmath>
const double EulerConstant = std::exp(1.0);
#包括
常数双欧拉常数=std::exp(1.0);

计算常量而不是赋值浮点文字的优点在于,它将产生一个精度,与特定C++实现的<>代码>双数据类型相匹配。它还消除了由于意外跳过一个数字而导致错误的可能性


如上图所示,
确实声明了,因此您无需自己滚动。

C++20
std::numbers::e

C++20还向标准库添加了一个
e
常量:

我希望用法如下:

#include <math>
#include <iostream>

int main() {
    std::cout << std::numbers::e << std::endl;
}
还有一个
std::numbers::pi
当然:-)

这些常量使用C++14变量模板功能:


在草稿的早期版本中,常量在
std::math::e

下,我也面临着这个学校的问题,我想如果没有cmath,我会计算欧拉数。所以我们需要计算1+1/1!+1/2! + ... + 1/n

我使用递归函数来实现这一点(主要是为了测试我关于e的解决方案):

#包括
#包括
使用名称空间std;
双阶乘(整数n){//Max n=170
如果(n==1)返回1;
否则返回n*阶乘(n-1);
}
双GetEuler(整数n){
如果(n==0)返回1;
else返回(1/阶乘(n)+GetEuler(n-1));
}
int main(){
int n;
双e;
e=GetEuler(170);

在计算e^n时,
n
是整数、实数还是复数?只有当它是整数时,
std::pow(Euler,n)
可能比简单的
std::exp(n)
更有效。同意!常数double比#define更好。请参阅Scott Meyers的“有效C++”习惯用法1还应注意,
std::exp
采用幂参数,因此如果您要计算
e^n
,存储常量是多余的,因为您可以将其写成
std::exp(n)
。仔细查看这个数字后,我发现n=17之后,Euler的数字不会随着可见数字的变化而变化。这将节省大量无用的操作和内存,不会让n=17发生这种情况。
#include <math>
#include <iostream>

int main() {
    std::cout << std::numbers::e << std::endl;
}
namespace std {
namespace math { 
template<typename T > inline constexpr T e_v = unspecified;
inline constexpr double e = e_v<double>;
#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;
}