之前在 C语言再学习 – C 标准库 - math.h 里有介绍 sin 和 cos 函数。但是这两个函数C语言该怎么实现呢?
首先看一下这两个函数的介绍:
函数介绍
C 库函数 - sin()
C 标准库 - <math.h>
描述
C 库函数 double sin(double x) 返回弧度角 x 的正弦。
声明
下面是 sin() 函数的声明。
double sin(double x)
参数
x – 浮点值,代表了一个以弧度表示的角度。
返回值
该函数返回 x 的正弦。
C 库函数 - cos()
C 标准库 - <math.h>
描述
C 库函数 double cos(double x) 返回弧度角 x 的余弦。
声明
下面是 cos() 函数的声明。
double cos(double x)
参数
x – 浮点值,代表了一个以弧度表示的角度。
返回值
该函数返回 x 的余弦。
注意:
这里需要注意的是:这两个C库函数的 参数是弧度
而手机计算器里的 sin cos 的参数单位是 角度
弧度和角度单位换算:
参看:日常生活小技巧 – 单位换算
1弧度(rad) = 180/PI 度(deg) = 57.29577951308232 度(deg)
1度(deg) = PI/180 弧度(rad) = 0.017453292519943 弧度(rad)
C语言实现 sinf 和 cosf 功能
#define PI (3.1415926F)
#define D_PI (6.2831852F)
#define TINY_VALUE (1e-3f) // computation accuracy
/** -----------------------------------------------------------------------------------------------
@brief absolute value function
@param[in] float x - input number
@return float result - absolute value of input data.
*//*---------------------------------------------------------------------------------------------*/
static inline float MyFabs(float x)
{
return (x > 0.0f) ? x : -x;
}
/** -----------------------------------------------------------------------------------------------
@brief sine calculation function
@param[in] float x - input number
@return float sum -result
*//*---------------------------------------------------------------------------------------------*/
float MySinf(float x)
{
float n,sum,x2,temp;
int32_t i, m;
/* the period of sine fucntion is 2*PI */
m = (int32_t)(x / D_PI);
x = x - D_PI * m;
n = x;
sum = 0.0f;
i = 1;
x2 = x * x;
/* Taylor expansion*/
do
{
sum += n;
i++;
temp = -n * x2;
n = temp / (((i << 2) - 6) * i + 2); // n = temp / (2*i - 1) / (2*i - 2);
} while (MyFabs(n)>=TINY_VALUE);
return sum;
}
/** -----------------------------------------------------------------------------------------------
@brief cosine calculation function
@param[in] float x - input number
@return float result
*//*---------------------------------------------------------------------------------------------*/
inline float MyCosf(float x)
{
return MySinf(PI/2.0f-x);
}