如何使用sinx = x - (x3 / 3)系列计算三角比率! +(x5 / 5)i - (x7 / 7)! + a in c program

时间:2011-06-27 17:11:59

标签: c

我想用c系列计算c中的三角比率

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

并希望将我的结果与标准数学库函数进行比较。 其中a =常数

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

如果问题是如何总结系列,你可以逐个更新这个词:

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;
}

答案 1 :(得分:1)

因子趋向于变得非常快(12!不适合32位变量);如果你不太关心精度细节等等,你可以像那样实现它

   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;
   }

或类似的东西(我没有测试过)。当然,这不是正确计算罪的准确方法。


除了使用函数 part ,它包含总和的单个“术语”,这是数学公式的直接(天真)明显的转换。让我们看看如何将公式放在一个更好的实现方式,并且具有更好的性能,但要尝试计算可能的1M sin-s或更多的差异。 (这个SO不能将TeX标记理解为其他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

另一个答案中给出的代码是这个“公式”的翻译,而不是原始公式的翻译。因此,翻译这个公式的代码或多或少会作为另一个答案:

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);
}

其中trunc_err是一个函数,由于系列的截断而计算错误。 (和以前一样,检查一切是否正确都留作练习)