Thứ Hai, 16 tháng 4, 2018

[Embedded] sine and cosine function implementation in c using Taylor series

As we have known that, in embedded, math library is sometimes unavailable and unreasonable. Hence, the necessity of diagonal functions such as sine or cosine which are portable, fast and accurate is quite high.

So I refer from this to get the formula:
http://www.wolframalpha.com/widgets/view.jsp?id=f9476968629e1163bd4a3ba839d60925

In C, subsequently, I implemented these functions which may help you:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int compare_float(double f1, double f2)
{
 //double precision = 0.00001;
 double precision = 0.00000000000000000001;
 if ((f1 - precision) < f2)
  {
return -1;
  }
 else if ((f1 + precision) > f2)
 {
  return 1;
 }
 else
  {
return 0;
  }
}
double cos(double x){
if( x < 0.0f ) 
x = -x;

if (0 <= compare_float(x,M_PI_M_2)) 
{
do {
x -= M_PI_M_2;
}while(0 <= compare_float(x,M_PI_M_2));

}

if ((0 <= compare_float(x, M_PI)) && (-1 == compare_float(x, M_PI_M_2)))
{
x -= M_PI;
return ((-1)*(1.0f - (x*x/2.0f)*( 1.0f - (x*x/12.0f) * ( 1.0f - (x*x/30.0f) * (1.0f - (x*x/56.0f )*(1.0f - (x*x/90.0f)*(1.0f - (x*x/132.0f)*(1.0f - (x*x/182.0f)))))))));
return 1.0f - (x*x/2.0f)*( 1.0f - (x*x/12.0f) * ( 1.0f - (x*x/30.0f) * (1.0f - (x*x/56.0f )*(1.0f - (x*x/90.0f)*(1.0f - (x*x/132.0f)*(1.0f - (x*x/182.0f)))))));
}
double sin(double x){return cos(x-M_PI_2);}

Không có nhận xét nào:

Đăng nhận xét