0
votes

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;

}
1
FYI, this is called argument reduction. It is simple if the argument is in degrees, and you should look up the standard library functions remquo, remainder and fmod. (remquo is particularly designed for angle reduction, as it provides the sector of a circle an angle is in.) For angles in radians, argument reduction is hard—doing it properly requires number theory and numerical analysis.Eric Postpischil

1 Answers

1
votes

cos(x) = cos(-x)

cos(x) = cos(x%360) if x is in degrees and x is positive

those identities should be sufficient to understand what to do, right?

likewise sin(-x) = -sin(x)

sin(x) = sin(x%360) if x is in degrees and x is positive