c ++从高精度双倍获得E?

时间:2013-12-11 02:39:27

标签: c++ types double precision

给出以下代码我希望使用无限和来计算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

2 个答案:

答案 0 :(得分:3)

这样做:

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

答案 1 :(得分:2)

100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

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

此外,您最好使用factorial计算double。尽管double提供的精度比long long int更少,但是阶乘的低位是零,因此double保持精确到更大的因子值。

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

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

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

     return f;
}