samedi 26 octobre 2019

Programming Sine and Cosine in C more efficently

Im writing a C code programm that calcultates sine and cosine of a given angle without using the Sine and Cosine Functions of the Math.h library.

But the problem I am facing right now is that i can only calculate the sine and cosine of the Angles between -90° - 90° (so the angles in the first and fourth quadrant). The Cosine(100) = Cosine(80) with a negative operator. So my way of thinking would be to just write code that whenever it gets an angle that is greater than 90 and smaller than 270, it should just substract the additional value from 90; so in the case of Cos(240) that would be the same as Cos(90-150) with an inverted operator infront.

How should one go about this, without having to write 180-if statements?

#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;

}

Aucun commentaire:

Enregistrer un commentaire