Saturday, December 17, 2011

18-Basic Trig Functions Calculated Using the McLauren Series

Basic Trig Functions Calculated Using the McLauren Series
The following application calculates approximations trig functions of sine, cosine, and tangent inputted as radians without using internal math functions in Java much as a scientific calculator might. I cannot claim they are optimal in efficiency, but they work. To download click here: trigFun.java.
import javax.swing.*;
public class trigFun
{
      public static void main(String args[])
      {       
         String temp;
         temp=JOptionPane.showInputDialog(null, "Enter an integer to take factorial of");
         int myFactorial=Integer.parseInt(temp);
         System.out.println("Factorial of("+temp+")="+factorial(myFactorial));
         temp=JOptionPane.showInputDialog(null, "Enter a radian value");
         double myRadian=Double.parseDouble(temp);
         System.out.println("sin("+myRadian+")="+sin(myRadian));
         System.out.println("cos("+myRadian+")="+cos(myRadian));
         System.out.println("tan("+myRadian+")="+tan(myRadian));    
      }
      public static double factorial(int n)
      {
         double sum=1;
         for(double i=n; i>0; i--)
         {
             sum=sum*i;
         }
         return sum;
      }
      public static double sin(double radian)//calculated using mclauren series
      {
         int sign;
         if (radian<-3.141592653589793)
               sign=0;
            else
              sign=1;
         if (sign==0)
         {
               while(radian<-3.141592653589793)
               {
                     radian=radian+6.283185307179586;
               }
         }
         if (sign==1)
         {
               while(radian>3.141592653589793)
               {
                     radian=radian-6.283185307179586;
               }
         }
           
         double result=0;     
         int j=1;                  
         for (double i=1; i<=21;i=i+2)
         //21 is a large arbitrary value
               if(j%2==0)
               {
                      result=result-1*(pow(radian, i))/((double)(factorial((int)(i))));
               }
               else
               {
                     result=result+1*(pow(radian, i))/((double)(factorial((int)(i))));
               }
               j=j+1;
         }
         return result;
      }
      public static double cos(double radian)
      {
         int sign;
         if (radian<0)
               sign=0;
            else
              sign=1;
         if (sign==0)
         {
               while(radian<-3.141592653589793)
               {
                     radian=radian+6.283185307179586;
               }
         }
         if (sign==1)
         {
               while(radian>3.141592653589793)
               {
                     radian=radian-6.283185307179586;
               }
         }
           
         double result=0;           
         int j=1;                  
         for (double i=0; i<=20;i=i+2)
         {
               if(j%2==0)
               {
                      result=result-1*(pow(radian, i))/((double)(factorial((int)(i))));
               }
               else
               {
                     result=result+1*(pow(radian, i))/((double)(factorial((int)(i))));
               }
               j=j+1;
         }
         return result;
      }
      public static double tan(double radian)
      {
         int sign;
         if (radian<0)
               sign=0;
            else
              sign=1;
         if (sign==0)
         {
               while(radian<-3.141592653589793)
               {
                     radian=radian+6.283185307179586;
               }
         }
         if (sign==1)
         {
               while(radian>3.141592653589793)
               {
                     radian=radian-6.283185307179586;
               }
         }
         return sin(radian)/cos(radian);
      }
      public static double pow(double b, double exp)
      { // an incomplete pow function that only calculates correctly for integer exp's
         double result=1;
         if(exp==0 && b==0)
               return 1./0;
         if(exp==0 && b !=0)
               return 1;              
         for(int i=1; i<=exp; i++)
         {
           result=result*b;
         }
         return result;
      }
}


0 comments:

Post a Comment