一、题目
008:计算直到最后一项的绝对值小于10^-7时,停止计算。x由键盘键入。
(书例3.32)
二、代码实现
思路:当最后一项满足绝对值限制条件时,停止累加求和
代码如下:
//008:计算sin(x)=x-x^3/3!+x^5/5!-x^7/7!+...,直到最后一项的绝对值小于10^-7时,停止计算。x由键盘键入
#include<stdio.h>
#include<math.h>
#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)=%f\n",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<stdio.h>
#include<math.h>
#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)=%f\n",x2,sum);
return 0;
}
再次计算:
please input:
40
sin(40.000000)=0.745113
按任意键关闭终端。
please input:
-150000
sin(-150000.000000)=-0.998696