70,037
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <math.h>
#include <float.h>
double XSin( double x )
{
static const double XSinTbl[] = {
0.00000000000000000 , 0.015707317311820675 , 0.031410759078128292 , 0.047106450709642665 , 0.062790519529313374 ,
0.078459095727844944 , 0.094108313318514325 , 0.10973431109104528 , 0.12533323356430426 , 0.14090123193758267 ,
0.15643446504023087 , 0.17192910027940955 , 0.18738131458572463 , 0.20278729535651249 , 0.21814324139654256 ,
0.23344536385590542 , 0.24868988716485479 , 0.26387304996537292 , 0.27899110603922928 , 0.29404032523230400 ,
0.30901699437494740 , 0.32391741819814940 , 0.33873792024529142 , 0.35347484377925714 , 0.36812455268467797 ,
0.38268343236508978 , 0.39714789063478062 , 0.41151435860510882 , 0.42577929156507272 , 0.43993916985591514 ,
0.45399049973954680 , 0.46792981426057340 , 0.48175367410171532 , 0.49545866843240760 , 0.50904141575037132 ,
0.52249856471594880 , 0.53582679497899666 , 0.54902281799813180 , 0.56208337785213058 , 0.57500525204327857 ,
0.58778525229247314 , 0.60042022532588402 , 0.61290705365297649 , 0.62524265633570519 , 0.63742398974868975 ,
0.64944804833018377 , 0.66131186532365183 , 0.67301251350977331 , 0.68454710592868873 , 0.69591279659231442 ,
0.70710678118654757 , 0.71812629776318881 , 0.72896862742141155 , 0.73963109497860968 , 0.75011106963045959 ,
0.76040596560003104 , 0.77051324277578925 , 0.78043040733832969 , 0.79015501237569041 , 0.79968465848709058 ,
0.80901699437494745 , 0.81814971742502351 , 0.82708057427456183 , 0.83580736136827027 , 0.84432792550201508 ,
0.85264016435409218 , 0.86074202700394364 , 0.86863151443819120 , 0.87630668004386369 , 0.88376563008869347 ,
0.89100652418836779 , 0.89802757576061565 , 0.90482705246601958 , 0.91140327663544529 , 0.91775462568398114 ,
0.92387953251128674 , 0.92977648588825146 , 0.93544403082986738 , 0.94088076895422557 , 0.94608535882754530 ,
0.95105651629515353 , 0.95579301479833012 , 0.96029368567694307 , 0.96455741845779808 , 0.96858316112863108 ,
0.97236992039767667 , 0.97591676193874743 , 0.97922281062176575 , 0.98228725072868872 , 0.98510932615477398 ,
0.98768834059513777 , 0.99002365771655754 , 0.99211470131447788 , 0.99396095545517971 , 0.99556196460308000 ,
0.99691733373312796 , 0.99802672842827156 , 0.99888987496197001 , 0.99950656036573160 , 0.99987663248166059 ,
1.00000000000000000 };
#define XPI (3.1415926535897932384626433832795)
#define XENTRY (100)
#define XINCL (XPI/2/XENTRY)
int s = 0 , n;
double dx , sx , cx;
if( x < 0 )
s = 1 , x = -x;
x = fmod( x , 2 * XPI );
if( x > XPI )
s = !s , x -= XPI;
if( x > XPI / 2 )
x = XPI - x;
n = (int)( x / XINCL );
dx = x - n * XINCL;
if( dx > XINCL / 2 )
++n , dx -= XINCL;
sx = XSinTbl[n];
cx = XSinTbl[XENTRY-n];
x = sx + dx*cx - (dx*dx)*sx/2
- (dx*dx*dx)*cx/6
+ (dx*dx*dx*dx)*sx/24
;
return s ? -x : x;
}
double XCos( double x )
{
return XSin( x + XPI/2 );
}
#define TESTM (100.)
#define TESTN (123456)
#define TESTINCL (TESTM/TESTN)
#define TESTE1 (1E-6)
#define TESTE2 (1E-6)
int main()
{
double diff , diffs , m;
double x , r1 , r2;
int i;
for( diff = diffs = 0 , i = 0 , x=0; i <= TESTN+10; ++i , x += TESTINCL )
{
r1 = sin(x);
r2 = XSin(x);
diffs += fabs(r1-r2);
if( fabs(r1-r2) > diff )
{
diff = fabs(r1-r2);
m = x;
}
}
printf( "%.18f %.18e %.18e %.18f %.18f\n" , m , diffs/TESTN , diff , sin(m) , XSin(m) );
for( diff = diffs = 0 , i = 0 , x=0; i <= TESTN+10; ++i , x += TESTINCL )
{
r1 = cos(x);
r2 = XCos(x);
diffs += fabs(r1-r2);
if( fabs(r1-r2) > diff )
{
diff = fabs(r1-r2);
m = x;
}
}
printf( "%.18f %.18e %.18e %.18f %.18f\n" , m , diffs/TESTN , diff , cos(m) , XCos(m) );
return 0;
}
float user_sin (float angle)
{
float x, t,temp;
int i;
i=(int)angle/360;
temp=(float)(angle-360*i);
if(temp<=90)
angle=temp;
else if(90<temp<=270)
angle=180-temp;
else
angle=temp-360;
x=(float)(angle*3.141592/180);
t=(float)(x-x*x*x/6+x*x*x*x*x/120);
return(t);
}