0

我正在尝试使用 maclaurin 的系列编写一个将x作为输入并作为输出的代码。我正在使用 while 循环,直到两个连续结果的差异小于 then 。我使用类型来容纳更大的值。代码在范围内时有效,但如果大于或小于此范围,则输出为。为什么会这样?输出值是否超出范围?我怎样才能解决这个问题 ??cos(x)0.001doublex[-2,2]x-1.#IND00

我的代码是:

#include <stdio.h>

double abs(double a);
double power(double p, int q);
int fact(int a);

int main()
{
    int i=1,j=2*i;
    double x,s=1.0,p,l=0.001;
    printf("Enter x: ");
    scanf("%lf", &x);
    p = s+ power(-1,i) * power(x,j) / fact(j);
    while (abs(p-s)>l){
        i++; j=2*i;
        s=p;
        p = s+ power(-1,i) * power(x,j) / fact(j);
    }
    printf("cos(%f) = %f", x,p);
    return 0;
}

double abs(double a)
{
    if (a>=0) return a;
    else return (-a);
}

double power(double p, int q)
{
    int i;
    double a=1.0;
    for (i=0; i<q; i++){
        a=a*p;
    }
    return a;   
}

int fact(int a)
{
    int i,p=1;
    if (a==0 || a==1) return 1;
    else
        while (a!=1){
            p=p*a;
            a--;
        }
        return p;
}
4

2 回答 2

0

scanf将您的功能更新为

scanf("%lf", &x);

您还需要检查powfact,这些功能可能会溢出。特别是,fact它只使用int.

于 2013-10-01T17:52:03.270 回答
0

随着|x|使用量的增加,需要更多的术语,fact()溢出和奇怪的结果随之而来。使用double.

// int fact(int a)
double myfact(double p, int q) {
  int i;
  double a = 1.0;
  for (i=0; i<q; i++){
    a=a*p;
  }
  return a;
}

最终值大于|x|> 30 时,使用此方法会出现其他限制。限制是由于精度而不是范围。对于较大的值,应使用显着不同的算法。


int abs(int j)之间的潜在冲突<stdlib.h>。原型可以通过stdio.hOP 找到并与之冲突double abs(double a)。无论如何,abs()它是一个标准库函数,OP 应该避免使用该函数名称。也建议重命名power()

// double abs(double a)
double myabs(double a)
于 2013-10-01T19:25:57.450 回答