头文件
自定一个头文件0709.h,将sinx cos x函数的原型声明、圆周率的常量定义、系统函数的文件包含置于其中,头文件具有避免重复使用功能。
#include<iostream>
#include<iomanip>
using namespace std;
const float PI = 3.141592f;
float fasin(float x);
float facos(float y);
sinx,cosx函数定义
使用泰勒展开,利用迭代法
sinx
float fasin(float x)
{
x = (x / 180.0) * PI;//将度数转化为弧度
float sum = x;
float k = -1.0;
float eve = x;//第一项
float n = 0;
while (eve < -1e-6 || eve>1e-6)
{
eve = -1.0*x * x * eve / ((n + 2.0f)*(n + 3.0f));//第n项
sum += eve;
n+=2.0;
}
return sum;
}
注意-1.0不能写成 k,然后在后面写k=-k,这样会使精度错误 (暂时不知道为什么)
cosx
原理与sinx差不多
float facos(float y)
{
y = (y / 180.0) * PI;
float sum = 1.0;
float n = 0;
float eve =1.0;//第一项
while (eve < -1e-6 || eve>1e-6)
{
eve = -1.0*eve * y * y / ((n+1.0) * (n + 2.0));//第n项
sum += eve;
n+=2.0;
}
return sum;
}
指针调用函数
float cal(float x, float (*p)(float))
{
return (*p)(x);//p指向函数的地址,*p找到函数并调用函数
}
全部代码
计算sin30°+cos60°
#include"0709.h"
float cal(float x, float (*p)(float));//指针调用函数
int main()
{
cout << "(sin30°+ cos60°)的值为:" << cal(30.0, fasin) + cal(60.0, facos) << endl;
return 0;
}
float cal(float x, float (*p)(float))
{
return (*p)(x);//p指向函数的地址,*p找到并返回函数
}
float fasin(float x)
{
x = (x / 180.0) * PI;
float sum = x;
float k = -1.0;
float eve = x;//第一项
float n = 0;
while (eve < -1e-6 || eve>1e-6)
{
eve = -1.0*x * x * eve / ((n + 2.0f)*(n + 3.0f));//第n项
sum += eve;
n+=2.0;
}
return sum;
}
float facos(float y)
{
y = (y / 180.0) * PI;
float sum = 1.0;
float n = 0;
float eve =1.0;//第一项
while (eve < -1e-6 || eve>1e-6)
{
eve = -1.0*eve * y * y / ((n+1.0) * (n + 2.0));//第n项
sum += eve;
n+=2.0;
}
return sum;
}