comment calculer le rapport sortinggonomésortingque en utilisant la série sinx = x – (x3 / 3)! + (x5 / 5) i – (x7 / 7)! + a in c programme

Je veux calculer le rapport sortinggonomésortingque en c en utilisant des séries

sinx = x - x3/3! + x5/5! - x7/7! + a 

et je veux comparer mon résultat avec la fonction lib math standard. où a = constant

toute allusion

Si la question est de savoir comment résumer la série, vous pouvez simplement mettre à jour le terme un par un:

 double sum_the_series(double x, size_t number_of_terms) { const double x2 = x * x; double term = x; double result = term; for (size_t i = 1; i < number_of_terms; ++i) { term = term * x2 / (double(2*i) * double(2*i+1)); if (i % 2 == 0) result += t; else result -= t; } return result; } 

La factorielle a tendance à devenir énorme très vite (12! Ne rentre pas dans une variable 32 bits); si vous ne vous souciez pas trop des détails de précision et plus, vous pouvez le mettre en œuvre très naïvement comme

  double fact(unsigned int n) { double r = 1.0; if (n == 0 || n == 1) return 1.0; // memoizing here can help while(n-- > 0) r *= (double)(n+1); return r; } double part(double x, int n) { return (n%2 == 0? -1 : 1)*pow(x, 2*n - 1)/fact(2*n-1); } double sinx(double x) { static const double a = 0.0020202; // a number int i; double r = 0.0; for (i = 1; i < MAXP; i++) r += part(x, i); return r + a; } 

ou quelque chose comme ça (je ne l'ai pas testé). Bien sûr, ce n'est pas la façon exacte dont le péché peut être calculé correctement.


Outre l'utilisation de la partie function, qui contient un seul "terme" de la sum, il s'agit d'une traduction évidente (naïve) de la formule mathématique. Voyons comment mettre la formule de manière qu'il soit préférable de la mettre en œuvre et d'avoir de meilleures performances, afin de goûter à toute différence dont vous avez besoin pour calculer 1M sin-s ou plus. (Ce SO ne comprend pas le balisage TeX comme d'autres sites SO?)

 x0 = x = x/1! x1 = -x^3/3! = -x/1! * x^2/(2 * 3) = x0 * x^2/(2 * 3) x2 = x^5/5! = x^3/3! * x^2/(4 * 5) = -x1 * x^2/(4 * 5) x3 = -x^7/7! = -x^5/5! * x^2/(6 * 7) = -x2 * x^2/(6 * 7) . . . xn = -x(n-1) * x^2/(2n * (2n + 1)) for n > 0 

Le code donné dans l'autre réponse est la traduction de cette "formule" et non de celle d'origine. Donc, le code, traduisant cette formule, serait comme l'autre réponse, plus ou moins:

 double sinx(double x, size_t t) { double term = x; double result = term; size_t i; for(i = 1; i < t; i++) { term *= -x*x/( (double)(2*i*(2*i + 1)) ); result += term; } return current + trunc_err(x, t); } 

où trunc_err est une fonction qui calcule l'erreur en raison de la troncature de la série. (Comme avant, vérifier si tout est correct est laissé comme exercice)