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