【问题标题】:c++ getting E from high precision double?c ++从高精度双精度中获取E?
【发布时间】:2013-12-28 20:38:18
【问题描述】:

鉴于以下代码,我希望使用无限和来将 e 计算到非常高的小数位,但我不确定如何在 c++ 中执行此操作,我使用 long long double 希望它可以工作,但是好像没有,有人知道怎么做吗?

  1 #ifndef E_H
  2 #define E_H
  3
  4 long int factorial(int a){
  5         if(a == 0){
  6                 return 1;
  7         }
  8         return a * factorial(a-1);
  9 }
 10
 11 long long double getE(){
 12         long long double e;
 13         for(int i = 0; i < 100; i++){
 14                 e += 1/(double)factorial(i);
 15         }
 16         return e;
 17 }
 18
 19 #endif

【问题讨论】:

  • 在什么情况下不工作?
  • 100!而且,它不适应在任何C ++内置数据类型没有截断的任何C ++内置数据类型中。您应该能够使用更小的阶乘将 e 计算到 17 位(double 提供的最大精度)。
  • 嗯,所以阶乘求和不是一个好方法,嗯?

标签: c++ types double precision


【解决方案1】:

100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 P>

这不适合任何没有截断的 C++ 基本数据类型。您应该能够使用更小的阶乘将 e 计算到 17 位(double 提供的最大精度)。你应该可以在 23 点左右停下来!或者。 (23! 是你第一次超越 double 精确表示阶乘的能力。我相信 27! 或 28! 是 80 位 long double 会失去动力的地方。)

另外,你最好用double 计算factorial。尽管double 提供的精度位比long long int 少,但阶乘的低位为零,因此double 在更大的阶乘值下仍保持精确。

最后,考虑使用循环而不是递归来计算阶乘。

double fact(int n)
{
     double f = 1.0;

     while (n > 1)
         f *= n--;

     return f;
}

【讨论】:

    【解决方案2】:

    这样做:

    const double E = std::exp(1.0); // from <cmath>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2013-08-10
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多