
// www.xbdev.net

// Simple sine function implementation - no lib's req.

// Forward Declarations.
double sine( double x);
double powerd( double x, int y);
double factorial_div( double value, int x);


/********************************************************************************/
/*                                                                              */
/*  sine( x )                                                                   */
/*                                                                              */
/********************************************************************************/

double sine( double x)
{
	int i=0;
	int j=1;
	int sign=1;
	double y1 = 0.0;
	double diff = 1000.0;
	if (x < 0.0)
	{
		x = -1 * x;
		sign = -1;
	}

	while ( x > 360.0*3.1415926/180)
	{
		x = x - 360*3.1415926/180;
	}// End while(..)

	if( x > (270.0 * 3.1415926 / 180) )
	{
		sign = sign * -1;
		x = 360.0*3.1415926/180 - x;

	} 
	else if ( x > (180.0 * 3.1415926 / 180) ) 
	{
		sign = sign * -1;
		x = x - 180.0 *3.1415926 / 180;

	} 
	else if ( x > (90.0 * 3.1415926 / 180) ) 
	{
		x = 180.0 *3.1415926 / 180 - x;

	}

	while( powerd( diff, 2) > 1.0E-16 ) 
	{
		i++;
		diff = j * factorial_div( powerd( x, (2*i -1)) ,(2*i -1));
		y1 = y1 + diff; 
		j = -1 * j;

	}// End while (..)
	return ( sign * y1 );
}// End sine(..)

/********************************************************************************/
/*                                                                              */
/*  powerd( x, power )                                                          */
/*                                                                              */
/********************************************************************************/

double powerd( double x, int y)
{
	int i=0;
	double ans=1.0;

	if(y==0) return 1.000;
	else 
	{
		while( i < y)
		{
			i++;
			ans = ans * x;

		}// End while(..)
	}// End else
	return ans;
}// End powerd(..)



/********************************************************************************/
/*                                                                              */
/*  factorial_div( value, x )                                                   */
/*                                                                              */
/********************************************************************************/

double factorial_div( double value, int x)
{
	if(x == 0) return 1;
	else
	{
		while( x > 1)
		{
			value = value / x--;

		}// End while(..)
	}// End else
	return value;
}// End factorial_div(..)


