如何用C ++计算Euler常数或Euler?

时间:2013-09-12 20:02:34

标签: c++ eulers-number

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

我认为'cmath'默认情况下不支持(函数和常量)。但是,可以启用它来包含编译器定义的常量,在本例中为M_E。这可以通过包含语句#define _USE_MATH_DEFINES来完成。

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

#define E 2.71828182845904523536;

const double EULER = 2.71828182845904523536;
这是说的。哪一个是接近这个数学常数的最“标准”方法?是其他任何图书馆吗?

3 个答案:

答案 0 :(得分:17)

如果您可以避免使用预处理器符号。当你最不期望它时会给你带来麻烦。 E可能会变成一个变量。

建议的解决方案:

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

计算常量而不是分配浮点字面值的优点是它将生成一个精度与特定C ++实现的double数据类型的精度相匹配的结果。并且它消除了意外跳过数字引入错误的可能性。

如上图所示,<cmath>确实声明了std::exp,因此您无需自行推广。

答案 1 :(得分:2)

C ++ 20 std::numbers::e

C ++ 20还向标准库http://eel.is/c++draft/numbers

中添加了一个e常量。

我希望用法像这样:

#include <math>
#include <iostream>

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

当支持到达GCC时,我会尝试一下,带有g++-9 -std=c++2a的GCC 9.1.0仍然不支持。

接受的提案描述:

  

5.0。 “标题” [headers]   在表[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 :-) How to use the PI constant in C++

这些常量使用C ++ 14变量模板功能:C++14 Variable Templates: what is their purpose? Any usage example?

在较早版本的草案中,常量位于std::math::e下:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0631r7.pdf

答案 2 :(得分:0)

我也正面临这个学校问题,并发现我可以在没有 cmath 的情况下计算欧拉数。所以我们需要计算 1 + 1/1! + 1/2! + ... + 1/n!。

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

#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

相关问题