问题解决:
在数学上对一些复杂的函数,常用多项式来近似表示函数。例如正弦函数sinx是用如下多项式来近似表达的:
sinx≈x−3!x3+5!x5−7!x7+⋯+(−1)n−1(2n−1)!x2n−1+⋯
在实际计算时当多项式尾项(−1)n−1(2n−1)!x2n−1的绝对值小于一个预定值ε(例如10−5或10−6)时可认为达到了计算精度要求,结束计算。请根据题目描述编写函数计算在x∈[0,π]处的正弦值。
编程要求:
编写两个函数,一个是求sinx的函数MySin(x),另一个是求n!的函数fact(n)。在函数sin(x)中调用fact(n)函数。其中公式中的xn可用库函数pow(x,n)来实现。
函数接口定义:
求n!的函数接口:
double fact ( int n );
参数n
是要求阶乘的数,是一个整数类型的参数,函数的返回值为double型.
求sinx值的函数:
double MySin(double x,double epsilon);
其中x
是sinx的自变量参数,epsilon
是计算精度要求参数。
裁判测试程序样例:
#include "stdio.h"
#include <math.h>
/* 请在这里填写答案 */
int main()
{
double x,epsilon;
scanf("%lf%lf",&x,&epsilon);
printf("%.15f\n",MySin(x,epsilon));
return 0;
}
输入说明:
在一行内输入两个数,两数之间用空格间隔,其中第一个数是自变量的值,第二者数是计算精度要求值。
输出说明:
输出一个值,输出保留17位小数。
输入样例:
在这里给出一组输入。例如:
1.1 0.00001
输出样例:
在这里给出相应的输出。例如:
0.891200933115079
解题代码
注意:先判断,后计算,否则会n++,使n值多 加一次
double fact ( int n )
{
double ret=1;
int i;
for(i=1;i<=n;i++)
{
ret*=i;
}
return ret;
}
double MySin(double x,double epsilon)
{
double y=0;
int flag=1;
int n;
for(n=1;n>=1;n+=2)
{
if(fabs(flag*pow(x,n)/fact(n))<epsilon)
return y;
y+=flag*pow(x,n)/fact(n);
flag=-flag;
}
}