#include
#include
#define PI 3.141592653
long factorial(int n);
double sin1(double x);
int main(void)
{
int x = 30;
double result = sin1(x);
printf("sin(%d°) = %f\n", x, result);
printf("Bye\n");
return 0;
}
/**
* 求阶乘
* @param n [description]
* @return [description]
*/
long factorial(int n)
{
if (n == 1)return 1;
else return (n * factorial(n - 1));
}
/**
* 计算sin(x),因为sin在math.h中定义了,所以这里方法名用sin1。
* sin(x) = x^1/1! - x^3/3! + x^5/5! - x^7/7! + ...
* 把表达式中的-号,转换为+号,方便计算。
* sin(x) = 1*x^1/1! + (-1)*x^3/3! + 1*x^5/5! + (-1)*x^7/7! + ...
* @param x 角度
* @return sin(x)
*/
double sin1(double x)
{
int flag1 = 1;// 表示符号位
int flag2 = 1;// 表示指数和阶乘,每次+2.
double xf; // 把输入的角度转成弧度,180度 = π弧度 => 1度 = π/180弧度。
double temp; // 保存每一项计算的结果
double sum = 0; // 保存最终结果
xf = PI / 180.0 * x;
do
{
temp = flag1 * pow(xf, flag2) / factorial(flag2);
sum += temp;
flag1 *= -1;
flag2 += 2;
} while (fabs(temp) - 0.000001 >= 0);// 判断最后一项的绝对值小于10的负6次方
return sum;
}