提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目要求
设计两个函数分别计算sinx和cosx,要求精度位1e-8,禁止使用任何数学函数
一、思路分析
利用泰勒展开式,求sinx和cosx的近似值
二、使用步骤
1.构造阶乘函数和绝对值函数
代码如下(示例):
//求绝对值的函数iabs
double iabs(double x)//与库中abs函数区分
{
return ((x>=0)?x:-x);//三目运算符
}
//求阶乘的函数fac
double fac(double x)
{
double fac=x;
while(x!=1)
{
fac*=(--x);
}
return fac;
}
2.构造三角函数
代码如下(示例):
double isin(double x)
{
double sign=1.0;//sign用于正负符号转换
double t=0.0;//t用于存放每一项的结果
double pow;//pow作分子
double result=0.0;
int n=1;
do
{
pow=1.0;
for(int i=0;i<n;i++)
{
pow*=x;//x的n次方
}
t = pow / fac(n)*sign;
result += t;
sign = -sign;
n+=2;
}while(iabs(t) >= 1e-8);
return result;
}
double icos(double x)
{
double sign = -1.0;
double t = 0.0,pow,result = 1.0;
int n=2;
do
{
pow=1.0;
for(int i = 0;i < n;i++)
{
pow*=x;
}
t=pow/fac(n)*sign;
result+=t;
sign=-sign;
n+=2;
}while(iabs(t)>=1e-8);
return result;
}
输出结果
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
#define PI 3.1415926
double iabs(double x)
{
return ((x>=0)?x:-x);
}
double fac(double x)
{
double fac=x;
while(x!=1)
{
fac*=(--x);
}
return fac;
}
double isin(double x)
{
double sign = 1.0;
double t = 0.0, pow , result = 0.0;
int n = 1;
do
{
pow = 1.0;
for (int i = 0; i < n; i++)
{
pow *= x;
}
t = pow / fac(n) * sign;
result += t;
sign = -sign;
n += 2;
} while (iabs(t) >= 1e-8);
return result;
}
double icos(double x)
{
double sign = -1.0;
double t = 0.0, pow, result = 1.0;
int n = 2;
do
{
pow = 1.0;
for (int i = 0; i < n; i++)
{
pow *= x;
}
t = pow / fac(n) * sign;
result += t;
sign = -sign;
n += 2;
} while (iabs(t) >= 1e-8);
return result;
}
int main()
{
cout<<fixed<<setprecision(5)<<"库函数:\n"<<sin(PI/6)+cos(PI/3)<<endl;
cout<<fixed<<setprecision(5)<<"自定义函数:\n"<<isin(PI/6)+icos(PI/3)<<endl;
system("pause");
return 0;
}