0

Hello

I have a question regarding this program in c.
My assignement is as follows :
*read the angle in degrees
*convert that angle in radians
*Apply the formula for calculating cosine function with factorials

*Then, automate the above calculating procedure by using loops

*Afterwords calculate the absolute error between those two cases

#include<stdio.h>
#include<math.h>
int main(void)
{
    double s_alpha;
    double s_alpha2=0;
    double j;
    short angle,i;
    double rad;
    long q;

    do
    {
        printf("\nInput angle [Degrees] : ");
        scanf("%hd",&angle);

        if(angle>0&&angle<360)
        {
            break;
            }
        printf("\nNot allowed_repeat\n");
    }while(angle<=0||angle>=360);

    rad=angle*(M_PI/180);

    s_alpha=1-((pow(rad,2))/(1*2)+
              (pow(rad,4))/(1*2*3*4)-
              (pow(rad,6))/(1*2*3*4*5*6)+
              (pow(rad,8))/(1*2*3*4*5*6*7*8)-
              (pow(rad,10))/(1*2*3*4*5*6*7*8*9*10)+
              (pow(rad,12))/(1*2*3*4*5*6*7*8*9*10*11*12));   //factorials by 'hand'

    int count=0;
    for(i=2;i<13;i+=2)
    {
        q=1.0;
        j=1.0;

        while(j<=i)            //factorials in a loop
        {
            q=q*j++;

            }

    count++;
        if(count%2==0)
        {
            j=(pow(rad,i)/q);
            s_alpha2-=j;
            }

        else
        {
            j=(pow(rad,i)/q);
            s_alpha2+=j;
            }

    }
    s_alpha2=1-s_alpha2;
    printf("\nAngle of %hd deg. = %g rad\n",angle,rad);
    for(i=0;i<27;i++)
    {
        printf("-");
        }

    printf("\nOutput: \nCalculated via function : \t%lf",s_alpha);
    printf("\nCalculated via loop : \t\t%lf",s_alpha2);
    printf("\nAbs error : \t\t\t%lf",s_alpha2-s_alpha);
    getchar();
    return 0;
}

What I would be much interested in learning is that is it possible for such a large error to appear while comparing those two cases. I also understand that there could also be a defect with the code, so any input is appreciated. Thank you very much !

2
Contributors
4
Replies
6
Views
6 Years
Discussion Span
Last Post by Joey_Brown
0

What is the range of shorts on your system? My old compiler has a SHRT_MAX in the header file <limits.h>, that won't go to 360.

If you make a habit of using the absolute minimal data type for your variables, you WILL get bitten by the "overflow" bug, a great deal. Engineers never build a structure to withstand a certain stress - it's always a certain stress PLUS a safety margin.

I think they started doing that about the time that architects/builders were killed if their buildings collapsed. ;)

0

I think they started doing that about the time that architects/builders were killed if their buildings collapsed.

lol.
Yes, well, my short range on a win7 64 [-32768;32767],GCC compiler, CB IDE. Ive started to explore the world of floating point arithmetics, and I understand the fact that both float and double data dont come out the way we would expect[of course if we apply arithmetic operations on them]. But the accuracy comming out from this loop is great. Does the loop affect the calculating accuarcy of the given task?

0

It looks like you're doing this in the upper code:

j=((pow(rad,i))/q;

but doing this in the lower code:

j=(pow(rad,i)/q);

I'm not sure if they're equivalent, or not.

That was a common punishment for an architect's failure, in the Ancient world. Kept the guys on their toes. ;)

Edited by Adak: n/a

0

Thanks. The error still exists, but thats probably the way it has to be. Cheers

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.