给定一个精度值e,用下列公式计算sin(x)的近似值,要求前后两次迭代之差的绝对值小于e,给出相应的最小迭代次数n和最后一次计算的sin(x)值。
sin x = x - x3/3! + x5/5! - x7/7! + ... + (-1)n-1x2n-1/(2n-1)!
其中x为弧度,n为正整数。
【输入形式】
从控制台输入x( (0<x<=10) )和e( x>e>0 )的值,以一个空格分隔。
【输出形式】
输出迭代次数n和最后一次计算的sin(x)的值(以一个空格分隔,并且输出sin(x)时要求小数点后保留9位有效数字)。
【样例输入】
1.23 0.0000001
【样例输出】
7 0.942488802
【样例说明】
输入的x为1.23,精度值e为0.0000001。当n为5时,利用上述公式计算sin(x)的值为0.942489044,n为6时计算的结果为0.942488800,两结果之差的绝对值约为0.000000244,大于要求的精度值0.0000001,故需要继续迭代计算。当n为7时计算的结果为0.942488802,与n为6的计算结果之差的绝对值约为0.000000002,小于要求的精度值,所以最小迭代次数应为7,最后一次计算的sin(x)的值为0.942488802(小数点后保留9位有效数字)。
注意:
(1) 为保证计算精度,请使用double数据类型保存计算数据。
(2) 应至少迭代两次,即:n>=2。
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
double sin,e,x,s=1;
int n=1,flag=0,i;
double k=1; //k做阶乘结果时要设成double,要不然会溢出
double x1=1,temp;
scanf("%lf",&x);
scanf("%lf",&e);
sin=x;
while(s>=e)
{
n+=1;
k=1; //注意:新一轮循环时,作为中间变量的k要归1
temp=sin;
/*
for(i=0;i<2n-1;i++)
{
x1*=x;
}*/
x1=pow(x,2*n-1); //注意:这里是2*n,不是2n!
for(i=1;i<=2*n-1;i++)
{
k*=i;
}
if(!flag)
sin-=x1/k;
else
sin+=x1/k;
flag=!flag;
s=fabs(temp-sin); //取绝对值
}
printf("%d %.9lf",n,sin);
system("pause"); //暂停程序(按任意键继续)以免弹太快看不见结果程序就结束了
return 0;
}