查表法处理sin,cos,tan函数-360到360度的值

1、把处理函数放到sincostan.h头文件中

/*********************************公式计算********************************/
/*
1.诱导公式
sin(-a)=-sin(a)
cos(-a)=cos(a)
sin(π2-a)=cos(a)
cos(π2-a)=sin(a)
sin(π2+a)=cos(a)
cos(π2+a)=-sin(a)
sin(π-a)=sin(a)
cos(π-a)=-cos(a)
sin(π+a)=-sin(a)
cos(π+a)=-cos(a)
2.两角和与差的三角函数
sin(a+b)=sin(a)cos(b)+cos(α)sin(b)
cos(a+b)=cos(a)cos(b)-sin(a)sin(b)
sin(a-b)=sin(a)cos(b)-cos(a)sin(b)
cos(a-b)=cos(a)cos(b)+sin(a)sin(b)
tan(a+b)=tan(a)+tan(b)1-tan(a)tan(b)
tan(a-b)=tan(a)-tan(b)1+tan(a)tan(b)
3.和差化积公式
sin(a)+sin(b)=2sin(a+b2)cos(a-b2)
sin(a)−sin(b)=2cos(a+b2)sin(a-b2)
cos(a)+cos(b)=2cos(a+b2)cos(a-b2)
cos(a)-cos(b)=-2sin(a+b2)sin(a-b2)
4.积化和差公式 (上面公式反过来就得到了)
sin(a)sin(b)=-12⋅[cos(a+b)-cos(a-b)]
cos(a)cos(b)=12⋅[cos(a+b)+cos(a-b)]
sin(a)cos(b)=12⋅[sin(a+b)+sin(a-b)]
5.二倍角公式
sin(2a)=2sin(a)cos(b)
cos(2a)=cos2(a)-sin2(a)=2cos2(a)-1=1-2sin2(a)
6.半角公式
sin2(a2)=1-cos(a)2
cos2(a2)=1+cos(a)2
tan(a2)=1-cos(a)sin(a)=sina1+cos(a)
7.万能公式
sin(a)=2tan(a2)1+tan2(a2)
cos(a)=1-tan2(a2)1+tan2(a2)
tan(a)=2tan(a2)1-tan2(a2) 
8.其它公式(推导出来的 ) 
a⋅sin(a)+b⋅cos(a)=a2+b2sin(a+c) 其中 tan(c)=ba
a⋅sin(a)+b⋅cos(a)=a2+b2cos(a-c) 其中 tan(c)=ab
1+sin(a)=(sin(a2)+cos(a2))2
1-sin(a)=(sin(a2)-cos(a2))2 
*/
#ifndef SINCOSTAN_H
#define SINCOSTAN_H 
 
double Sin[91]={0.0000,\
0.0174,0.0348,0.0523,0.0697,0.0871,0.1045,0.1218,0.1391,0.1564,\
0.1736,0.1908,0.2079,0.2249,0.2419,0.2588,0.2756,0.2923,0.3090,\
0.3255,0.3420,0.3583,0.3746,0.3907,0.4067,0.4226,0.4383,0.4539,\
0.4694,0.4848,0.4999,0.5150,0.5299,0.5446,0.5591,0.5735,0.5877,\
0.6018,0.6156,0.6293,0.6427,0.6560,0.6691,0.6819,0.6946,0.7071,\
0.7193,0.7313,0.7431,0.7547,0.7660,0.7771,0.7880,0.7986,0.8090,\
0.8191,0.8290,0.8386,0.8480,0.8571,0.8660,0.8746,0.8829,0.8910,\
0.8987,0.9063,0.9135,0.9205,0.9271,0.9335,0.9396,0.9455,0.9510,\
0.9563,0.9612,0.9659,0.9702,0.9743,0.9781,0.9816,0.9848,0.9876,\
0.9902,0.9925,0.9945,0.9961,0.9975,0.9986,0.9993,0.9998,1.0000,};
double Cos[91]={1.0000,\
0.9998,0.9993,0.9986,0.9975,0.9961,0.9945,0.9925,0.9902,0.9876,\
0.9848,0.9816,0.9781,0.9743,0.9702,0.9659,0.9612,0.9563,0.9510,\
0.9455,0.9396,0.9335,0.9271,0.9205,0.9135,0.9063,0.8987,0.8910,\
0.8829,0.8746,0.8660,0.8571,0.8480,0.8386,0.8290,0.8191,0.8090,\
0.7986,0.7880,0.7771,0.7660,0.7547,0.7431,0.7313,0.7193,0.7071,\
0.6946,0.6819,0.6691,0.6560,0.6427,0.6293,0.6156,0.6018,0.5877,\
0.5735,0.5591,0.5446,0.5299,0.5150,0.5000,0.4848,0.4694,0.4539,\
0.4383,0.4226,0.4067,0.3907,0.3746,0.3583,0.3420,0.3255,0.3090,\
0.2923,0.2756,0.2588,0.2419,0.2249,0.2079,0.1908,0.1736,0.1564,\
0.1391,0.1218,0.1045,0.0871,0.0697,0.0523,0.0348,0.0174,0.0000,};
double Tan[91]={0.0000,\
0.0174,0.0349,0.0524,0.0699,0.0874,0.1051,0.1227,0.1405,0.1583,\
0.1763,0.1943,0.2125,0.2308,0.2493,0.2679,0.2867,0.3057,0.3249,\
0.3443,0.3639,0.3838,0.4040,0.4244,0.4452,0.4663,0.4877,0.5095,\
0.5317,0.5543,0.5773,0.6008,0.6248,0.6494,0.6745,0.7002,0.7265,\
0.7535,0.7812,0.8097,0.8390,0.8692,0.9004,0.9325,0.9656,0.9999,\
1.0355,1.0723,1.1106,1.1503,1.1917,1.2348,1.2799,1.3270,1.3763,\
1.4281,1.4825,1.5398,1.6003,1.6642,1.7320,1.8040,1.8807,1.9626,\
2.0503,2.1445,2.2460,2.3558,2.4750,2.6050,2.7474,2.9042,3.0776,\
3.2708,3.4874,3.7320,4.0107,4.3314,4.7046,5.1445,5.6712,6.3137,\
7.1153,8.1443,9.5143,11.430,14.300,19.081,28.636,57.289,0.0000,};/*tan90无限大,设置为0*/
double sin_angle(int angle) {
    double ret=0.00; 
    if ((angle>=0&&angle<=90)||(angle>=-360&&angle<=-270)){
		if(angle>0)ret=Sin[angle];
		else       ret=Sin[360+angle];
		return ret;
	} 
    if ((angle>90&&angle<=180)||(angle>-270&&angle<=-180)){
		if(angle>0)ret=Sin[180-angle];
		else       ret=Sin[0-angle-180];
		return ret;
	}
	if ((angle>180&&angle<=270)||(angle>-180&&angle<=-90)){
		 if(angle>0)ret=0-Sin[angle-180];
		 else       ret=0-Sin[180+angle];
		 return ret;
	}		
	if ((angle>270&&angle<= 360)||(angle>-90&&angle<=0)){
		 if(angle>0)ret=0-Sin[360-angle];
		 else       ret=0-Sin[0-angle];
		 return ret;
	}  
	return 0;
}
double cos_angle(int angle) {
    double ret; 
    if ((angle>=0&&angle<=90)||(angle>=-360&&angle<=-270)){
		if(angle>0)ret=Cos[angle];
		else       ret=Cos[360+angle];
		return ret;
	} 
    if ((angle>90&&angle<=180)||(angle>-270&&angle<=-180)){
		if(angle>0)ret=0-Cos[180-angle];
		else       ret=0-Cos[0-angle-180];
		return ret;
	}
	if ((angle>180&&angle<=270)||(angle>-180&&angle<=-90)){
		 if(angle>0)ret=0-Cos[angle-180];
		 else       ret=0-Cos[180+angle];
		 return ret;
	}		
	if ((angle>270&&angle<= 360)||(angle>-90&&angle<=0)){
		 if(angle>0)ret=Cos[360-angle];
		 else       ret=Cos[0-angle];
		 return ret;
	}
	return 0;
}
double tan_angle(int angle) {
    double ret; 
    if ((angle>=0&&angle<=90)||(angle>=-360&&angle<=-270)){
		if(angle>0)ret=Tan[angle];
		else       ret=Tan[360+angle];
		return ret;
	} 
    if ((angle>90&&angle<=180)||(angle>-270&&angle<=-180)){
 		if(angle>0)ret=0-Tan[180-angle];
 		else       ret=0-Tan[0-angle-180];
 		return ret;
 	}
 	if ((angle>180&&angle<=270)||(angle>-180&&angle<=-90)){
 		 if(angle>0)ret=Tan[angle-180];
 		 else       ret=Tan[180+angle];
 		 return ret;
 	}		
 	if ((angle>270&&angle<= 360)||(angle>-90&&angle<=0)){
 		 if(angle>0)ret=0-Tan[360-angle];
 		 else       ret=0-Tan[0-angle];
 		 return ret;
 	}
	return ret;
}
#endif 

2、main函数调用

#include <stdio.h>
#include "sincostan.h"
int main() {
    int i;
    for(i=-360;i<361;i++)printf("sin(%d)=%f\n",i,sin_angle(i));
	for(i=-360;i<361;i++)printf("cos(%d)=%f\n",i,cos_angle(i));
	for(i=-360;i<361;i++)printf("tan(%d)=%f\n",i,tan_angle(i));
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果你想在C语言中使用查表来计算三角函数的输出,并将结果映射到0-16384的范围内,可以先创建一个包含预计算的查找表,然后根据输入角度查表获取近似的输出。 以下是一个示例代码,展示了如何使用查表计算正弦函数的近似,并将结果映射到0-16384的范围内: ```c #include <stdio.h> #include <math.h> #define PI 3.14159265 #define TABLE_SIZE 360 #define RANGE_MAX 16384 int sin_lookup[TABLE_SIZE]; void init_sin_lookup() { for (int i = 0; i < TABLE_SIZE; i++) { sin_lookup[i] = (int)(sin(i * PI / 180) * RANGE_MAX); } } int sin_approx(int angle) { angle %= 360; // 将角度限制在0-359范围内 if (angle < 0) { angle += 360; } return sin_lookup[angle]; } int main() { int angle = 30; init_sin_lookup(); int sin_value = sin_approx(angle); printf("sin(%d) = %d\n", angle, sin_value); return 0; } ``` 在上述代码中,我们首先定义了一个大小为360的查找表 `sin_lookup`,用来存储预计算的正弦。然后在 `init_sin_lookup` 函数中,我们使用 `sin` 函数计算每个角度对应的正弦,并将其乘以 `RANGE_MAX` 进行缩放,存储到查找表中。 在 `sin_approx` 函数中,我们首先将输入角度限制在0-359的范围内,然后通过查表获取对应角度的近似正弦。 请注意,由于查表是一种近似计算方,所以结果可能会有一定的误差。如果需要更高精度的三角函数计算,建议使用浮点类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那肯定是很多年以后!

你的鼓励就我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值