008:计算直到最后一项的绝对值小于10^-7时,停止计算。x由键盘键入。
(书例3.32)
代码如下:
//008:计算sin(x)=x-x^3/3!+x^5/5!-x^7/7!+...,直到最后一项的绝对值小于10^-7时,停止计算。x由键盘键入 #include运行结果#include #define eps 1e-7 //定义一个常量,注意不要加分号!! int main() { double item=0,sum=0,x;//每一项:item;累加和:sum; int i; printf("please input:n"); scanf("%lf",&x);//注意scanf()接受double类型要用%lf item=x; for(i=1;fabs(item)>=eps;i++) { sum+=item; item*=((-1)*x*x)/(2*i*(2*i+1));//for循环进行累加 } printf("sin(%f)=%fn",x,sum); return 0; }
please input: 4 sin(4.000000)=-0.756803 按任意键关闭终端。
please input: 20 sin(20.000000)=0.912945 按任意键关闭终端。暂不考虑精度问题,当输入的x稍微大一点,程序输出便会错误,比如:
please input: 40 sin(40.000000)=1.069746 按任意键关闭终端。这里考虑对变量进行优化,将其全部改成0到2π范围,再进行近似计算(因为sin()是周期函数),使用一个递归即可,修改后如下:
//008:计算sin(x)=x-x^3/3!+x^5/5!-x^7/7!+...,直到最后一项的绝对值小于10^-7时,停止计算。x由键盘键入 #include再次计算:#include #define eps 1e-7 //定义一个常量,注意不要加分号!! #define pi 3.1415926 double fix_sin(double t) { double x1;//返回修正后的x值 if(t>=0&&t<=2*pi) x1=t; else if(t>0) x1=fix_sin(t-2*pi); else x1=fix_sin(t+2*pi); return x1;//使用递归来修正 } int main() { double item=0,sum=0,x,x2;//每一项:item;累加和:sum; int i; printf("please input:n"); scanf("%lf",&x);//注意scanf()接受double类型要用%lf x2=x; x=fix_sin(x); item=x; for(i=1;fabs(item)>=eps;i++) { sum+=item; item*=((-1)*x*x)/(2*i*(2*i+1));//for循环进行累加 } printf("sin(%f)=%fn",x2,sum); return 0; }
please input: 40 sin(40.000000)=0.745113 按任意键关闭终端。
please input: -150000 sin(-150000.000000)=-0.998696修改后的代码可以处理更大一点的x(大概输入-20万到20万都行)



