#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define pi 3.1415926535897932
double sinx(double a);
int main(void)
{
double a;
scanf("%lf", &a);
printf("a = %lf\n", a);
printf("角a(弧度制)的正弦值为:%lf \n",sinx(a));
return 0;
}
double sinx(double a)
{
int i;
double angle[] = {atan(1),atan(1/2),atan(1/4),atan(1/8),atan(1/16),
atan(1/32),atan(1/64),atan(1/128),atan(1/256),atan(1/512),
atan(1/1024),atan(1/2048),atan(1/4096),atan(1/9192)};
double tan1[]={1,1/2,1/4,1/8,1/16,1/32,1/64,1/128,1/256,
1/512,1/1024,1/2048,1/4096,1/9192};
if(a <= (atan(1/9192))) {
return a; //因为a的值太小,sin a 约等于 a
}else{
//开始 CORDIC 算法
int negative = a < 0; // sin(-a) = -sin(a)
double x = 10;
double y = 0;
double theta = 0;
for(i = 0;i < 13;i ++){ //开始迭代
double orix,oriy;
while(theta < a){ //当前角度小于a
orix = x;
oriy = y;
//坐标旋转
x = orix - tan1[i] * oriy;
y = tan1[i] * orix + oriy;
theta += angle[i];
}
if(theta == a){
if(negative){
return -(y/sqrt((x*x+y*y)));
}else{
return (y/sqrt((x*x+y*y)));
}
}else{
//旋转的弧度超过了a,退回原来增加的角度,同时进入下一次迭代
theta -= angle[i];
x = orix;
y = oriy;
}
}
if(negative){
return -(y/sqrt((x*x+y*y)));
}else{
return (y/sqrt((x*x+y*y)));
}
}
}