【问题标题】:How to calculate Euler constant or Euler powered in C++?如何计算欧拉常数或 C++ 驱动的欧拉?
【发布时间】:2013-09-17 09:00:57
【问题描述】:

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

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

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

#define E 2.71828182845904523536;

const double EULER = 2.71828182845904523536;

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

【问题讨论】:

  • 在计算 e^n 时,n 是整数、实数还是复数?只有当它是一个整数时,std::pow(Euler,n) 才可能比简单的std::exp(n) 更有效。

标签: c++ eulers-number


【解决方案1】:

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

建议的解决方案:

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

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

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

【讨论】:

  • 同意!并且 const double 比#define 更好。参见 Scott Meyers 的“Effective C++”成语 1
  • 还应注意std::exp 采用幂参数,因此如果您要计算e^n,存储常量是多余的,因为您可以将其写为std::exp(n)
【解决方案2】:

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 时我会试一试,带有 g++-9 -std=c++2a 的 GCC 9.1.0 仍然不支持它。

接受的提案描述:

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 :-) How to use the PI constant in C++

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

在草稿的早期版本中,常量位于std::math::ehttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0631r7.pdf

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多