下面那个回答一样的是我小号,刚才提交答案的时候卡了半天,没法修改,所以换了个号复制了下,结果……忘了贴代码了。
---------------------------
int类型溢出了。
jc里面定义的是int sum=1,i; 而13!就超过了int的4字节范围,所以当迭代次数太多时就会溢出,导致阶乘得到的结果错误,所以main里面的sum永远无法逼近cosx,导致n永远返回0,进而造成死循环。
另外,return p= pow(x,2*n); 这一句也容易造成溢出,如果输入的x>1,那么容易上溢出,而x<1会导致计算结果变成0 。
阶乘项因为是在分母,所以可以改成除法,不用乘法以免溢出(当然太小了精度不够还是会变成0)。幂函数的溢出可以和阶乘交替计算,幂乘一次阶乘除一次,这样不会溢出。
抛开溢出的问题,代码还有三个毛病:
一个是main里面循环中的if,可以写在for前面,让for从1开始。
另一个是阶乘,每次调用都从1开始算,完全可以利用前面的计算结果,比如计算10!的时候可以直接用上次的8!的结果,这样可以省掉很多无谓的计算时间。
第三个,你公式写错了,cosx的展开第一项是1,sinx的第一项才是x 。
--------------------
修改了下你的代码:
double jc(double n,int m)
{
double t=1;
for(int i=1;i<=m;i++)
t=t*n/i;
return t;
}
//com函数我没改
int main()
{
double x,t,sum,pi2=6.2831853;
int i,j;
bool n=0;
while(1){
cout<<"请输入X:";
cin>>x;
t=x;
while(x>pi2) x-=pi2;
while(x<-pi2) x+=pi2;
sum=1;n=0;j=-1;
for(i=1;n!=1;i++)
{
sum=sum+j*jc(x,i*2);
j=-j;
n=com(sum,x);
if(i>20000) break; //这里防死循环的,其实计算正确的话用不了这么多次。
}
cout<<"COS"<}
}
int类型溢出了。
jc里面定义的是int sum=1,i; 而13!就超过了int的4字节范围,所以当迭代次数太多时就会溢出,导致阶乘得到的结果错误,所以main里面的sum永远无法逼近cosx,导致n永远返回0,进而造成死循环。
另外,return p= pow(x,2*n); 这一句也容易造成溢出,如果输入的x>1,那么容易上溢出,而x<1会导致计算结果变成0 。
阶乘项因为是在分母,所以可以改成除法,不用乘法以免溢出(当然太小了精度不够还是会变成0)。幂函数的溢出可以和阶乘交替计算,幂乘一次阶乘除一次,这样不会溢出。
抛开溢出的问题,代码还有两毛病,一个是main里面循环中的if,可以写在for前面,让for从1开始。另一个是阶乘,每次调用都从1开始算,完全可以利用前面的计算结果,比如计算10!的时候可以直接用上次的8!的结果,这样可以省掉很多无谓的计算时间。
#include
#include
using namespace std;
int jc(int n)
{
int sum=1,i;
for(i=1;i<=n;i++)
sum=sum*i;
return sum;
}
float m(int n,double x)
{ double p;
return p= pow(x,2*n);
}
int com( double a,double x)
{
double b=(a-cos(x))/cos(x);
if(fabs(b)<=0.000001)
return 1;
else
return 0;
}
void main()
{
double x,sum=0;
int i,j=-1; bool n=0;
cout<<"请输入X:";
cin>>x;
for(i=0;n!=1;i++)
{
if(i==0)
{
sum=x;
continue;
}
sum=sum+j*m(i,x)/jc(i*2);
cout<
n=com(sum,x);
}
cout<<"COS"<
//我真的很奇怪,要算cos值直接用math.h里的函数就行了,为什么要写这么复杂。而且,你看我程序里加的那一句,打出来之后会发现有很多数据根本不对
#include
#include
#include
using namespace std;
int main()
{
int a;
cout<<"Enter a number:"<
cout<
}
//直接这样写就好了,setprecision就是确定精度的函数
注意, 建立变量的同时进行始初化是一个非常好的习惯.
b[m]=b[m]+d; // 使用了未初始化的变量
建议可更换:
int b[1024] = { 0 }; //初始化数组所有元素为0
另说一下:
百度无大神
以上回答你满意么?