Created
May 16, 2018 09:50
-
-
Save giangnguyen2412/bcab883b5a53b437b980d7be9745beaf to your computer and use it in GitHub Desktop.
sine and cosine function implementation in C using Taylor series
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdlib.h> | |
#include <stdio.h> | |
#include <math.h> | |
int compare_float(double f1, double f2) | |
{ | |
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);} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks @giangnguyen2412 for this example.
I managed to implement the float port cosine, and rewrote above code as following, which can make Taylor's series more scalable, although 7 times works well for float.
float c_cos(float x)
{
const float pi = 3.1415927;
}
Ref: https://en.wikipedia.org/wiki/Sine_and_cosine