Jonn Ralge Yuvallos - 2 years ago 130
C Question

# Implementing Taylor Series for sine and cosine in C

I've been following the guide my prof gave us, but I just can't find where I went wrong. I've also been going through some other questions about implementing the Taylor Series in C.

Just assume that RaiseTo(raise a number to the power of x) is there.

``````double factorial (int n)
{
int fact = 1,
flag;

for (flag = 1; flag <= n; flag++)
{
fact *= flag;
}

return flag;
}

double sine (double rad)
{

int flag_2,
plusOrMinus2 = 0; //1 for plus, 0 for minus
double sin,
terms;

terms = NUMBER_OF_TERMS; //10 terms

for (flag_2 = 1; flag_2 <= 2 * terms; flag_2 += 2)
{

if (plusOrMinus2 == 0)
{
plusOrMinus2++; //Add the next number
}

else
{
plusOrMinus2--; //Subtract the next number
}
}

sin = val2;
return sin;
}

int main()
{
int degree;
scanf("%d", &degree);
double rad, cosx, sinx;
rad = degree * PI / 180.00;
//cosx = cosine (rad);
sinx = sine (rad);
printf("%lf \n%lf", rad, sinx);
}
``````

So during the loop, I get the rad^x, divide it by the factorial of the odd number series starting from 1, then add or subtract it depending on what's needed, but when I run the program, I get outputs way above one, and we all know that the limits of sin(x) are 1 and -1, I'd really like to know where I went wrong so I could improve, sorry if it's a pretty bad question.

Anything over `12!` is larger than can fit into a 32-bit `int`, so such values will overflow and therefore won't return what you expect.
Instead of computing the full factorial each time, take a look at each term in the sequence relative to the previous one. For any given term, the next one is `-((x*x)/(flag_2*(flag_2-1))` times the previous one. So start with a term of `x`, then multiply by that factor for each successive term.
There's also a trick to calculating the result to the precision of a `double` without knowing how many terms you need. I'll leave that as an exercise to the reader.