复试:求sinx,cosx在x=0处的泰勒展开式,精确到10e-7,以及编程中出的错误

复试 求sinx在x=0处的泰勒展开式,精确到10e-7

以及求cosx在x=0出的泰勒展开式,精确到。。。

1.

#INF:这个值表示“无穷大inf (infinity 的缩写)”,即超出了计算机可以表示的浮点数的最大范围(或者说超过了 double 类型的最大值)。一般来说是除数为0得出的结果,例如,当一个整数除以0时便会得到一个1.#INF / inf值;相应的,如果一个负整数除以0会得到 -1.#INF / -inf 值。

2.

#IND:这个的情况更复杂,一般来说,它们来自于任何未定义结果(非法)的浮点数运算。"IND"是 indeterminate(不确定) 的缩写,而"nan"是 not a number 的缩写。IND表示NAN, 比如 0/0 log( -1 ) 等等。IND是Windows上的说法,NaN是Linux上的说法,含义是一样的。产生这个值的常见例子有:对负数开平方,对负数取对数,0.0/0.0,0.0*∞, ∞/∞ 等。也可能由于一些操作使得程序中产生了无效数字或者没有给成员变量赋值,使用类似于pow, exp等等函数时常会产生一个无效数字1.#IND00(-1.#IND00 对应符号位 1 , 阶码全1 , 尾数非0 )。

0.一个约分函数(没卵用)

先写一个分数约分的函数
void Yuefen(int &c,int &d) //一个可以约分的程序
{

int a=c;int b=d;
int ifchange=1;
while(ifchange==1)
{
	ifchange=0;
for(int i=2;i<=a&&i<=b;i++)
{
	
	
	if((a%i==0)&&(b%i==0))
	{
		a/=i;b/=i;
		ifchange=1;
	}
	
}
}
c=a;d=b;

}
int main()
{
int a,b;
while(1)
{
cin>>a;
cin>>b;
Yuefen(a,b);
cout<<a<<"/"<<b<<endl;
}
int c;cin>>c;
}

1.

/****求sinx的值,精确到10的-7次方/
int jingdu(double x)
{
if(x>-0.0000001&&x<0.0000001) return 1;
else return 0;
}
double xi(int x)//系数,即级数的倒数
{
long int result=1;
if(x0||x1) return result;

else for(int i=1;i<=x;i++)
{
	result=result*i;
}
return (double)1/result;

}
double mi(double a,int i)//次方项的计算
{
double result=1;
if(i0) return result;
else for(int j=1;j<=i;j++)
{
result=result*a;
}
return result;
}
int positive(int i)
{
if(i%2
1) return 1;
else return -1;
}
double entity(double x,int i)//当输入为x时的第i项;
{
double zhengfu=positive(i);
double xishu=xi(2i-1);
double miresult=mi(x,2
i-1);

double result=zhengfu*xishu*miresult;
cout<<zhengfu<<"  "<<xishu<<"   "<<miresult<<"   "<<result<<endl;
return result;

}
****求sinx的值,精确到10的-7次方/
int main()
{
double in;
cin>>in;
cout<<in<<endl;
double result=0;
for(int i=1;/jingdu(entity(in,i))==0/i<=10;i++)为了方便起见,并且因为计算时出错,所以只是循环了十次
{
result=result+entity(in,i);
}
cout<<“最终结果:”<<result<<endl;
/while(1)
{
int k;
cin>>k;
cout<<entity(0.26,k)<<endl;
}
/
int c;
cin>>c;

}
运行结果如下:在这里插入图片描述
可以看到在计算过程中1/13!已经不对,正确结果应为1.605904384e-10,甚至可以看到在1/17!的时候出现了负数!下面分析原因。

2.出错原因

因为在以上的函数中在求级数的倒数时,先用了一个int型数据保存的级数,而int型数据位数有限,导致在处理1/13!的级数时先用int保存了13!,然而int型并不能保存这么多的位数,导致溢出,这在编程时是一个很容易忽视的问题,也是一个很隐蔽的问题。也就是说,数据达到13!的规模的时候就不能用int来保存了。
因此求系数的函数double xi(int i)修改如下:
double xi(int x)
{
double result=1;
if(x0||x1) return result;

else for(int i=1;i<=x;i++)
{
	result=result/i;
}
return result;

}
用double小数点后的精度来弥补int长度的不足。

3.完整代码如下:

int jingdu(double x)
{
if(x>-0.0000001&&x<0.0000001) return 1;
else return 0;
}
double xi(int x)
{
double result=1;
if(x0||x1) return result;

else for(int i=1;i<=x;i++)
{
	result=result/i;
}
return result;

}
double mi(double a,int i)
{
double result=1;
if(i0) return result;
else for(int j=1;j<=i;j++)
{
result=result*a;
}
return result;
}
int positive(int i)
{
if(i%2
1) return 1;
else return -1;
}
double entity(double x,int i)//当输入为x时的第i项;
{
double zhengfu=positive(i);
double xishu=xi(2i-1);
double miresult=mi(x,2
i-1);

double result=zhengfu*xishu*miresult;
cout<<zhengfu<<"  "<<xishu<<"   "<<miresult<<"   "<<result<<endl;
return result;

}
//****求sinx的值,精确到10的-7次方/
int main()
{
double in;
cin>>in;
cout<<in<<endl;
double result=0;
for(int i=1;jingdu(entity(in,i))==0;i++)
{
result=result+entity(in,i);
}
cout<<“最终结果:”<<result<<endl;
/while(1)
{
int k;
cin>>k;
cout<<entity(0.26,k)<<endl;
}
/
int c;
cin>>c;

}

4.结论

1.

一定要注意溢出这个不常见但是很难察觉的问题!

2.

无论是直接int=123*…,还是x的结果/(1234…),都会溢出,尤其是第二项,他会将后面部分的除数先算出来并保存到一个int型数据中,一般就会溢出,基本数据错误就是出现在这里,因此这类问题尽量使用double来保存数据;
错误用法:
double a=1/4: 错误!结果是先按int算1/4=0,a=0;
正确写法:
double b=1;c=4;
double a=b/c;
或者:
double a=(double)1/4;

第二次编程出错代码:

#include
#include
using namespace std;
int symbol(int n)
{
if(n%2==0) return 1;
else return -1;
}
double cifang(double x,int n)
{
double outcome=1;
for(int i=0;i<=n;i++)//此处应从1开始
{
outcome=outcomex;
}
cout<<“次方:”<<outcome<<" ";
return outcome;
}
double jiecheng(int n)
{
double outcome=1;
for(int i=1;i<=n;i++)
{
outcome=outcome
i;
}
cout<<“阶乘:”<<outcome<<" ";
return outcome;

}
double jueduizhi(double x)
{
if(x<0) return -1x;
else return x;
}
double dinxiang(double x,int n)
{
return symbol(n)cifang(x,2n)/(double)jiecheng(2
n);
}
int main()
{
double x;
cin>>x;
double kuhanshu=cos(x);
double outcome=0;
double jingdu;
cin>>jingdu;
for(int i=0;i<=10/jueduizhi(outcome-kuhanshu)>=jingdu/;i++)
{
outcome=outcome+dinxiang(x,i);cout<<“第”<<i<<“项:”<<dinxiang<<endl;//此处dinxiang应该为dinxiang(x,i);怪不得输出结果老是含有数字和字母,看起来像十六进制的数。
}
cout<<outcome<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值