2017-04-06 4 views
0

Je fais la calculatrice simple et c'est partie de la fonction e^x.codage e^x fonction en utilisant Taylor Series sans utiliser math.h et la fonction factorielle

cela fonctionne pour le nombre positif, mais pas pour le négatif x. Comment puis-je faire cela fonctionne pour x négatif aussi? `

double calculateEx(double x) { 
double beforeResult = 1, afterResult = 1, term = 1, error = 1, i = 1, j; 

while (error > 0.001) { 
    afterResult = beforeResult; 
    for (j = 1; j <= i; j++) { 
     term *= x; 
    } 
    term /= fact(i); 
    afterResult += term; 
    error = (afterResult - beforeResult)/afterResult; 
    if (error < 0) error * -1; 
    error *= 100; 
    beforeResult = afterResult; 
    term = 1; 
    i++; 
} 
return beforeResult; 

}

double fact (double num) { 
int i, j; 
double total = 1; 

for (i = 2; i <= num; i++) { 
    total = total * i; 
} 
return total; 

}

+0

Pourquoi ne pas utiliser '' ? La fonction 'exp' est susceptible d'être plus rapide que n'importe quel code que vous pourriez facilement écrire en C (dans certains cas, il peut s'agir d'une seule instruction machine, mais au moins vous pouvez vous attendre à ce que les auteurs de la bibliothèque l'optimisent dans un pouce de sa vie). – alastair

+0

Petit drapeau de révision de code rouge: Vous avez * trois * boucles. Est-ce vraiment nécessaire? –

+0

C'est mon travail à l'école, le professeur a ordonné de ne pas utiliser la bibliothèque math.h. Je vais l'utiliser plus tard dans mes propres travaux @alastair – april

Répondre

2

Lors du calcul exposant par série Taylor

exp(x) = 1 + x/1 + x**2/2! + ... + x**n/n! 

vous ne voulez pas factorielles, s'il vous plaît, notez que si n-1 e terme est

t(n-1) = x**(n-1)/(n-1)! 

puis

 t(n) = x**n/n! = t(n-1) * x/n; 

Voilà pourquoi tout ce que vous avez à mettre en œuvre est:

double calculateEx(double x) { 
    double term = 1.0; 
    double result = term; 

    /* 
     the only trick is that term can be positive as well as negative; 
     we should either use abs in any implementation or putr two conditions 
    */ 
    for (int n = 1; term > 0.001 || term < -0.001; ++n) { 
     term = term * x/n; 

     result += term; 
    } 

    return result; 
    } 
0

OK, comme je l'ai écrit dans un commentaire ci-dessus, j'utiliser <math.h> si au tous possible, mais puisque vous avez posé la question:

  1. Pour le faire fonctionner avec negati Si le chiffre x est négatif, considérez ce qui se passe si vous le niez.

  2. Vous pouvez vous débarrasser de la fonction factorielle en stockant une table de factoriels. Vous n'aurez pas besoin de beaucoup d'éléments.