在C语言中更有效地编程正弦和余弦

在C语言中更有效地编程正弦和余弦,c,if-statement,optimization,C,If Statement,Optimization,我正在写一个C代码程序,计算给定角度的正弦和余弦,而不使用Math.h库中的正弦和余弦函数 但我现在面临的问题是,我只能计算-90°-90°之间角度的正弦和余弦(因此第一象限和第四象限的角度)。余弦(100)=带有负运算符的余弦(80)。所以我的想法是,只要写一段代码,每当它得到一个大于90小于270的角度,它就应该从90减去附加值;因此,在Cos(240)的情况下,这将与前面有一个反向运算符的Cos(90-150)相同 不必写180个if语句,我们应该如何进行呢 #include <st

我正在写一个C代码程序,计算给定角度的正弦和余弦,而不使用Math.h库中的正弦和余弦函数

但我现在面临的问题是,我只能计算-90°-90°之间角度的正弦和余弦(因此第一象限和第四象限的角度)。余弦(100)=带有负运算符的余弦(80)。所以我的想法是,只要写一段代码,每当它得到一个大于90小于270的角度,它就应该从90减去附加值;因此,在Cos(240)的情况下,这将与前面有一个反向运算符的Cos(90-150)相同

不必写180个if语句,我们应该如何进行呢

#include <stdio.h>
#include <math.h>

int main() {

  double alpha[29];
  alpha[0] = 45.00000000;
  alpha[1] = 26.56505118;
  alpha[2] = 14.03624347;
  alpha[3] = 7.12501635;
  alpha[4] = 3.57633437;
  alpha[5] = 1.78991061;
  alpha[6] = 0.89517371;
  alpha[7] = 0.44761417;
  alpha[8] = 0.22381050;
  alpha[9] = 0.11190568;
  alpha[10] = 0.05595289;
  alpha[11] = 0.02797645;
  alpha[12] = 0.01398823;
  alpha[13] = 0.00699411;
  alpha[14] = 0.00349706;
  alpha[15] = 0.00174853;
  alpha[16] = 0.00087426;
  alpha[17] = 0.00043713;
  alpha[18] = 0.00021857;
  alpha[19] = 0.00010928;
  alpha[20] = 0.00005464;
  alpha[21] = 0.00002732;
  alpha[22] = 0.00001366;
  alpha[23] = 0.00000683;
  alpha[24] = 0.00000342;
  alpha[25] = 0.00000171;
  alpha[26] = 0.00000085;
  alpha[27] = 0.00000043;
  alpha[28] = 0.00000021;

  double x = 0.60725294;

  double y = 0;
  double winkel = -150;
  double theta = winkel;
  double xs;
  double ys;
  int i = 0;


  }
  while ( i < 29 ){

    printf("This is run number %d with theta = %lf \n", i, theta);
    xs = y / pow(2, i);  
    ys = x / pow(2, i);                              

    if (theta <= 0){
       x = x + xs;
       y = y - ys;
       theta = theta + alpha[i];
    } else {
      x = x - xs;
      y = y + ys;
      theta = theta - alpha[i];
    };
    printf("x = %lf   and   y = %lf \n \n",x,y);
    i++;
  }


  printf("cosine = %lf\n", x);
  printf("sine = %lf\n", y);
  return 0;

}
#包括
#包括
int main(){
双α[29];
α[0]=45.00000000;
α[1]=26.56505118;
α[2]=14.03624347;
α[3]=7.1250165;
α[4]=3.57633437;
α[5]=1.78991061;
α[6]=0.89517371;
α[7]=0.44761417;
α[8]=0.22381050;
α[9]=0.11190568;
α[10]=0.05595289;
α[11]=0.02797645;
α[12]=0.01398823;
α[13]=0.00699411;
α[14]=0.00349706;
α[15]=0.00174853;
α[16]=0.00087426;
α[17]=0.00043713;
α[18]=0.00021857;
α[19]=0.00010928;
α[20]=0.00005464;
α[21]=0.00002732;
α[22]=0.00001366;
α[23]=0.00000683;
α[24]=0.00000342;
α[25]=0.00000171;
α[26]=0.00000085;
α[27]=0.00000043;
α[28]=0.00000021;
双x=0.60725294;
双y=0;
双温克尔=-150;
双θ=温克尔;
双X;
双Y;
int i=0;
}
而(i<29){
printf(“这是运行编号%d,θ=%lf\n”,i,θ);
xs=y/pow(2,i);
ys=x/pow(2,i);
如果(θcos(x)=cos(-x)

cos(x)=cos(x%360),如果x为度且x为正

这些身份应该足以理解该怎么做,对吗

同样,sin(-x)=-sin(x)

sin(x)=sin(x%360)如果x以度为单位且x为正

FYI,这称为参数缩减。如果参数以度为单位,这很简单,您应该查找标准库函数
remquo
余数
fmod
。(
remquo
是专门为角度缩减而设计的,因为它提供了一个角度所在圆的扇形。)对于以弧度为单位的角度,参数缩减是很困难的。正确地进行参数缩减需要数论和数值分析。