计算cosx和sinx的近似值
Description
遍一个程序计算sinx和cosx的近似值,使用如下的台劳级数:
舍去的绝对值应小于ε
Input
输入文件包括2个实数x,ε,两个数间有一空格。
Output
输出文件共两行
第一行输出sinx的近似值
第二行输出cosx的近似值
Sample Input
5 0.001
Sample Output
-0.958776 0.284221
Source
习题06-01
问题分析:
这个题目是对公式的理解和实现。通过观察,发现一下的规律。
1.每一项的组成形式是X^K/K!;
2.每一项的符号与K有关。Kmod4为1,4的是正的,Kmod4为2,3的是负的;
3.sin是K为奇数时候的累加,cos是K为偶数时候的累加;
4.对于X的初值的处理,需要将这个数字转换成2*pi以内的数。
解决方案:
用一个while循环控制程序。维护里面的条件是单项的值小于给出的初值。对if进行一个奇数偶数的判断,可以在一个循环中完成对sinx和cosx的叠加分配。我使用了一个子函数item专门来计算每一项的值。在计算的时候使用一个大小为K的循环,来计算X^K/K!。具体的可以见参考程序。
参考程序:
#include
#include
const double pi=3.1415926; //define pi
double item(int n);
double x;
int main()
{
scanf("%lf",&x);
double e;
scanf("%lf",&e);
x=x-(floor(x/(2*pi)))*(2*pi); //change x to 0~2*pi
double sinx=0.0;
double cosx=0.0;
int n=0;
double now=item(n); //here we can change to do……while
while(fabs(now)>e)
{
if(n%2==0) { // if n%2==0 cosx+ else sinx+
cosx=cosx+now;
}
else{
sinx=sinx+now;
}
n++;
now=item(n);
}
printf("%lf\n",sinx);
printf("%lf\n",cosx);
return 0;
}
double item(int k)
{
double ans=1.0;
int i;
for(i=1;i<=k;i++) { //here to cal X^K/K!
ans*=x;
ans/=i;
}
if(k%4==2||k%4==3)
{
ans=-ans;
}
return ans;
}
分享到:
2010-12-14 01:39
浏览 2334
评论