views:

229

answers:

3

Ok so here's what i have so far:

#include <stdio.h>
#include <math.h>
//#define PI 3.14159

int factorial(int n){
  if(n <= 1)
    return(1);
  else
    return(n * factorial(n-1));
}

void McLaurin(float pi){
  int factorial(int);
  float x = 42*pi/180;
  int i, val=0, sign;

  for(i=1, sign=-1; i<11; i+=2){
    sign *= -1; // alternate sign of cos(0) which is 1
    val += (sign*(pow(x, i)) / factorial(i));
  }

  printf("\nMcLaurin of 42 = %d\n", val);
}

void Taylor(float pi){
  int factorial(int);
  float x;
  int i;
  float val=0.00, sign;
  float a = pi/3;

  printf("Enter x in degrees:\n");
  scanf("%f", &x);
  x=x*pi/180.0;
  printf("%f",x);

  for(i=0, sign=-1.0; i<2; i++){
    if(i%2==1)
      sign *= -1.0; // alternate sign of cos(0) which is 1
    printf("%f",sign);
    if(i%2==1)
      val += (sign*sin(a)*(pow(x-a, i)) / factorial(i));
    else
      val += (sign*cos(a)*(pow(x-a, i)) / factorial(i));
    printf("%d",factorial(i));
  }

  printf("\nTaylor of sin(%g degrees) = %d\n", (x*180.0)/pi, val);
}

main(){
  float pi=3.14159;
  void McLaurin(float);
  void Taylor(float);

  McLaurin(pi);
  Taylor(pi);
}

and here's the output:

McLaurin of 42 = 0
Enter x in degrees:
42
0.733038-1.00000011.0000001
Taylor of sin(42 degrees) = -1073741824

I suspect the reason for these outrageous numbers goes with the fact that I mixed up my floats and ints? But i just cant figure it out...!! Maybe its a math thing, but its never been a strength of mine let alone program with calculus. Also the Mclaurin fails, how does it equal zero? WTF! Please help correct my noobish code. I am still a beginner...

----Update----

#include <stdio.h>
#include <math.h>
//#define PI 3.14159

int factorial(int n){
  if(n <= 1)
    return(1);
  else
    return(n * factorial(n-1));
}

void McLaurin(float pi){
  int factorial(int);
  float x = 42*pi/180, val=0;
  int i, sign;

  for(i=1, sign=-1; i<11; i+=2){
    sign *= -1; // alternate sign of cos(0) which is 1
    val += (sign*(pow(x, i)) / factorial(i));
  }

  printf("\nMcLaurin of of sin(%f degrees) = %f\n", (x*180.0)/pi, val);
}

void Taylor(float pi){
  int factorial(int);
  float x;
  int i;
  float val=0, sign;
  float a = pi/3;

  printf("Enter x in degrees:\n");
  scanf("%f", &x);
  x=x*pi/180.0;
  printf("%f",x);

  for(i=0, sign=-1.0; i<2; i++){
    if(i%2==0)
      sign *= -1; // alternate sign of cos(0) which is 1
    printf("%f",sign);
    if(i%2==0)
      val += (sign*sin(a)*(pow(x-a, i)) / factorial(i));
    else
      val += (sign*cos(a)*(pow(x-a, i)) / factorial(i));
    printf("%d",factorial(i));
  }

  printf("\nTaylor of sin(%f degrees) = %f\n", (x*180.0)/pi, val);
}

main(){
  float pi=3.14159;
  void McLaurin(float);
  void Taylor(float);

  McLaurin(pi);
  Taylor(pi);
}

Gives me weird error.

/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot open output file a.exe: Device or resource busy
collect2: ld returned 1 exit status
Can anyone explain what's wrong now?
+1  A: 

Some potential sources of error:

  • your value of pi doesn't have sufficient digits for even float accuracy;
  • in your function Maclaurin you have val as an integer, on which you perform division;
  • in Taylor you only use 2 terms in the series

I think ?

High Performance Mark
+1  A: 

a few things jump out:

  1. in McLauren you define val (your calculated value) as an int. try defining it as a float
  2. in Taylor you are only flipping your sign every other time so it goes -1, 1, -1, -1, 1, 1 .... and so on
  3. i think your formula for the Taylor series is incorrect, after refreshing myself on wikipedia, you shouldn't be calling sin or cos (because that's what you are trying to calculate)

good luck!

luke
The third one is fine. He's using sin and cos because they correspond with various derivatives of sin(x). The purpose of the code, I believe, is to compare the two expansions.
Justin Peel
correct, Justin
I probably should have explained that, but in this case we are aiming for f(x0=sin(x) and then using taylor and mclauren rule for that function
+1  A: 

This one that have already been mentioned is definitely troublesome:

  • val should be a float in McLaurin()

In addition, you need to use %f or %g instead of %d when using printf() to print out your vals. That's ultimately why you're getting such crazy numbers: floats being interpreted as ints.

Also, in Taylor(), you need to change your two if statements to be

if(i%2==0)

because you are Taylor expanding sin, not cos.

Doing these things yields 0.669130 and 0.708945 for the MacLaurin and Taylor series answers, respectively, using the same number of terms as in your code. If I add two more terms to the Taylor series answer (use i<4 instead of i<2), I get 0.668793. The true answer (using the same pi as you used) is 0.669130 which the Taylor series answer gets to with 3 more additional terms added in.

Justin Peel
alright now for some reason after fixing everything you have stated i am getting:/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot open output file a.exe: Device or resource busycollect2: ld returned 1 exit status
@user352258, I don't know what to tell you. I did the changes and compiled it fine with the MinGW gcc compiler.
Justin Peel