2017-02-20 32 views
3

Я написал программу на C, которая должна вычислять и печатать приближение e^x для всех значений до n. Я использую это уравнение для реализации моей программы.Как исправить мою программу аппроксимации e^x?

f (x, n) = e^x = сумма i = 0 до n = x^i/x! = x^0/0! + x^1/1! + x^2/2! + .... + x^n/n!

Это мой код:

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 

double factorial(int n){ 
     double fac =1; 
     int i; 
     for(i =1; i <= n; i++){ 
       fac *=n; 
     } 
     return fac; 
} 
double exponent(double x, int n){ 
     double sum, i; 
     for(i = 0; i <=n; i++){ 
       sum += (pow(x, i)/ factorial(i)); 
     } 
     return sum; 
} 

int main(int argc, char *argv[]){ 
     int n = atoi(argv[1]); 
     double x = atof(argv[2]); 
     printf("\ti\tApproximantion\n"); 
     printf("-------------------------------------\n"); 
     int i; 
     for(i =0; i <=n; i++){ 
       printf("\t%d\t%f\n", i, exponent(x,i)); 
     } 
     printf("Exact Value =\t%12f\n", exp(x)); 
     return 0; 
}//main 

Я использую итерации вместо рекурсии. Мой выходной ток с помощью ./aprroximation 10 2.2 является:

 i  Approximation 
------------------------------------- 
     0  1.000000 
     1  3.200000 
     2  4.410000 
     3  4.804370 
     4  7.895877 
     5  8.912368 
     6  9.914798 
     7  10.915101 
     8  11.915134 
     9  12.915137 
     10  13.915137 
Exact Value =  9.025013 

вывод должен быть: (игнорировать пространство/табуляции)

i Approximation 
-------------------------------- 
    0 1.0000000000 
    1 3.2000000000 
    2 5.6200000000 
    3 7.3946666667 
    4 8.3707333333 
    5 8.8002026667 
    6 8.9576747556 
    7 9.0071659835 
    8 9.0207760712 
    9 9.0241029815 
    10 9.0248349018 
Exact Value = 9.0250134994 

Я не могу найти проблему в моем коде. Я посмотрел на некоторый псевдокод для функций факториала и мощности, и ничего не выделяется. Мои результаты по-прежнему ошибочны. Есть предположения?

+4

Повторное вычисление факториала снова и снова наивно и дорого. – duffymo

+0

С вашего вывода, похоже, что 'sum' увеличивается на 1 каждый раз после шага 9. Можете ли вы проверить это, введя' n' not 10, но скажите 13-15 и посмотрите, поддерживает ли это? –

+0

И хм я не могу воспроизвести с вашим кодом, выход отличается: на [ideone] (http://ideone.com/Bok1D8). –

ответ

3

Я вижу, вы не инициализировали переменную sum внутри функции exponent(). Инициализируйте его до нуля, иначе функция exponent() выглядит нормально.

double exponent(double x, int n){ 
    double sum = 0, i; 
    for(i = 0; i <=n; i++){ 
     sum += pow(x, i)/ factorial(i); 
    } 
    return sum; 
} 

Update

Я пятно еще одну проблему в функции factorial(). Подумайте, верно ли утверждение внутри цикла for!

for(i=1; i<=n; i++){ 
    fac *= n; 
} 

Что вы вычисления здесь не n!, это n^n. Вы должны сделать следующее.

for(i=1; i<=n; i++){ 
    fac *= i; 
} 
+0

Я этого не замечал.Это действительно помогло, но мое самое высокое число было еще 4, поэтому выход неправильный. Любые другие ошибки, которые вы можете обнаружить? –

+0

@below_avg_st см. Мой обновленный ответ. –

5

Есть две проблемы:

  1. В функции exponent вы не инициализировать sum
  2. Ваша factorial функция неправильно.

Если вы протестировали функцию factorial по отдельности, вы бы легко узнали сами по себе, по крайней мере, эту проблему.