0

好吧,我对特定的 C 代码有疑问。我正在处理一项不使用任何“精炼”编码的任务,也就是说,用最简单的库和函数做常规的事情。特别是,我只被允许使用 stdio.h ,而不是任何库。也没有字符串。

问题:我必须使用以下表达式计算用户给出的实数 x(以双精度存储)的余弦:cos (x) = ((x^(2i))/((2i)! ))*(-1)^i,所有这些都在从 i = 0 到 i = n 的 sumatore 中,n 是用户选择的精度(一个 int 数)。好的,到目前为止,我已经设法完成了这段代码:

        scanf("%lf", &x);
        r1 = x;
        scanf("%d", &n);
        for (i = 0; i <= n; i++){
            for(cont1 = 0; cont1 < 2*i; cont1++){
                r1 = r1*r1;
            }
            for(cont2 = 1; cont2 <= 2*i; cont2++){
                r2 = r2*cont2;
            }
            for(cont3 = 1; cont3 < i; cont3++){
                r3 = (-1)*(-1);
            }
            result = result + (r1/r2)*r3;
        }
        printf("The result is %lf\n", result);

但是输出总是1.#INF00,一直。有人知道为什么会这样吗?有人可以告诉我如何设法获得正确的代码吗?将不胜感激。

先感谢您。

4

2 回答 2

1

术语计算不正确。
术语变量不会重新初始化每个循环,这似乎是 OP 算法的需要。

[编辑] 代码

double MyCosine(double Angle, int Terms) {
  int cont1, cont2, cont3;
  double r1, r2, r3;
  // r1 = Angle;
  int i, n = Terms;
  double result = 0.0;
  for (i = 0; i <= n; i++) {
    r1 = 1.0;
    for (cont1 = 0; cont1 < 2 * i; cont1++) {
      // r1 = r1 * r1;
      r1 = r1 * Angle;
    }
    r2 = 1.0;
    for (cont2 = 1; cont2 <= 2 * i; cont2++) {
      r2 = r2 * cont2;
    }
    r3 = 1;
    // for (cont3 = 1; cont3 < i; cont3++) {
    for (cont3 = 0; cont3 < i; cont3++) {
      // r3 = (-1) * (-1);
      r3 = r3 * (-1);
    }
    result = result + (r1 / r2) * r3;
  }
  printf("%e %e\n", result, cos(Angle));
  return result;
}

重写不需要重新初始化术语,然后for可以消除嵌套循环。存在其他简化。

于 2013-09-28T19:54:19.540 回答
0

当您计算 termsx^(2i) / (2i)!时,您不能分别计算x^(2i)and(2i)!然后除法,因为它们都会增长得比适合 a 的最大数字大double。因此,您遇到了infs 和类似的问题。

您需要找到一种更聪明、更稳健的方法来计算这些项(这可能是本次作业的重点)。

于 2013-09-28T19:32:59.137 回答