我正在尝试编写一个代码,将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;
}
答案 0 :(得分:0)
将您的scanf
功能更新为
scanf("%lf", &x);
此外,您需要检查pow
和fact
,这些功能可能会溢出。特别是,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)