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

问题描述 投票:0回答:4

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

我认为“cmath”默认情况下不提供对两者(函数和常量)的支持。但是,它可以包含编译器定义的常量,在本例中为

M_E
。这可以通过包含语句
#define _USE_MATH_DEFINES
来完成。

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

#define E 2.71828182845904523536;

const double EULER = 2.71828182845904523536;

这样说。哪一种是接近这个数学常数的最“标准”方法?还有其他图书馆吗?

c++ eulers-number
4个回答
28
投票

如果您可以避免使用预处理器符号,那么您应该避免使用。它会在你最意想不到的时候给你带来麻烦。

E
很可能会成为一个变量。

建议的解决方案:

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

计算常量而不是分配浮点文字的优点是,它将生成精度与特定 C++ 实现的

double
数据类型的精度相匹配的结果。并且它消除了因意外跳过数字而引入错误的可能性。

如上所示,

<cmath>
确实声明了
std::exp
,因此您无需自行滚动。


7
投票

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
:-)如何在C++中使用PI常量

这些常量使用 C++14 变量模板功能: C++14 变量模板:它们的用途是什么?有使用示例吗?

在草案的早期版本中,常量位于

std::math::e
下: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0631r7.pdf


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


0
投票

OP说他“专注于计算e^n”,从这个角度来看(我不知道为什么没有人指出这一点),他需要的只是std::exp(n)函数.

所以我认为你可以使用 std::exp(n) 函数并得到你想要的,而不管欧拉常数的计算。

此外,欧拉常数的值可以使用 std::exp(1.0) 计算,如 IInspectable 所解释的。

© www.soinside.com 2019 - 2024. All rights reserved.