19

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

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

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

#define E 2.71828182845904523536;

或者

const double EULER = 2.71828182845904523536;

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

4

3 回答 3

24

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

建议的解决方案:

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

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

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

于 2013-09-12T20:10:39.173 回答
6

C++20std::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.0g++-9 -std=c++2a仍然不支持它。

接受的提案描述:

5.0。“Headers” [headers] 在表 [tab:cpp.library.headers] 中,需要添加一个新的 header。

[...]

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::ehttp ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0631r7.pdf

于 2019-07-31T07:33:36.613 回答
-1

我也正面临这个学校问题,并且发现我可以在没有 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

于 2021-05-26T02:08:08.077 回答