2013-12-11 4 views
0

Учитывая следующий код, я надеялся использовать бесконечную сумму для вычисления e в очень высоком десятичном разряде, но я не уверен, как это сделать в C++, я использовал длинный двойной двойной в надежде, что он сработает, но он Кажется, никто не знает, как это сделать?C++ получение E от высокой точности двойной?

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

В каком качестве это не работает? – nhgrif

+2

100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758253110021091686400000000000000000000000000, и это не соответствует ни одному встроенному типу данных C++ без усечения. Вы должны уметь вычислять e до 17 мест (максимальная точность, предлагаемая 'double') с гораздо меньшим факториалом. –

+0

Хмм, поэтому факториальное выражение не является хорошим способом сделать это, а? –

ответ

2

100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

и что не вписывается в тип базы данных любого C++ без усечения. Вы должны уметь вычислять e до 17 мест (максимальная точность, предлагаемая двойным) с гораздо меньшим факториалом. Вы должны быть в порядке, останавливаясь около 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; 
} 
Смежные вопросы