计算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<stdio.h> #include<math.h> 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; }