-1。#IND00输出某些输入值

时间:2013-10-01 17:47:49

标签: c

我正在尝试编写一个代码,将x作为输入,并使用maclaurin的系列给出cos(x)作为输出。我使用while循环直到两个连续结果的差异为少于0.001。我使用double类型来容纳更大的值。 当x[-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;
}

2 个答案:

答案 0 :(得分:0)

将您的scanf功能更新为

scanf("%lf", &x);

此外,您需要检查powfact,这些功能可能会溢出。特别是,fact仅使用int

答案 1 :(得分: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|&gt; 30,使用这种方法的其他限制。限制是由于精度而非范围。对于较大的值,应使用明显不同的算法。


int abs(int j)<stdlib.h>之间的潜在冲突。可以通过stdio.h找到原型 ,并与OP double abs(double a)冲突。在任何情况下,abs()都是标准库函数,OP应该避免使用该函数名。还建议重命名power()

// double abs(double a)
double myabs(double a)