⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sinll.c

📁 128位长双精度型数字运算包
💻 C
字号:
/*							sinl.c * *	Circular sine, long double precision * * * * SYNOPSIS: * * long double x, y, sinl(); * * y = sinl( x ); * * * * DESCRIPTION: * * Range reduction is into intervals of pi/4.  The reduction * error is nearly eliminated by contriving an extended precision * modular arithmetic. * * Two polynomial approximating functions are employed. * Between 0 and pi/4 the sine is approximated by the Cody * and Waite polynomial form *      x + x^3 P(x^2) . * Between pi/4 and pi/2 the cosine is represented as *      1 - .5 x^2 + x^4 Q(x^2) . * * * ACCURACY: * *                      Relative error: * arithmetic   domain      # trials      peak         rms *    IEEE     +-3.6e16      100,000    2.0e-34     5.3e-35 *  * ERROR MESSAGES: * *   message           condition        value returned * sin total loss      x > 2^55              0.0 * *//*							cosl.c * *	Circular cosine, long double precision * * * * SYNOPSIS: * * long double x, y, cosl(); * * y = cosl( x ); * * * * DESCRIPTION: * * Range reduction is into intervals of pi/4.  The reduction * error is nearly eliminated by contriving an extended precision * modular arithmetic. * * Two polynomial approximating functions are employed. * Between 0 and pi/4 the cosine is approximated by *      1 - .5 x^2 + x^4 Q(x^2) . * Between pi/4 and pi/2 the sine is represented by the Cody * and Waite polynomial form *      x  +  x^3 P(x^2) . * * * ACCURACY: * *                      Relative error: * arithmetic   domain      # trials      peak         rms *    IEEE     +-3.6e16     100,000      2.0e-34     5.2e-35 * * ERROR MESSAGES: * *   message           condition        value returned * cos total loss      x > 2^55              0.0 *//*							sin.c	*//*Cephes Math Library Release 2.2:  December, 1990Copyright 1985, 1990 by Stephen L. MoshierDirect inquiries to 30 Frost Street, Cambridge, MA 02140*/#include "mconf.h"/* sin(x) = x + x^3 P(x^2) * Theoretical peak relative error = 5.6e-39 * relative peak error spread = 1.7e-9 */static long double sincof[12] = { 6.410290407010279602425714995528976754871E-26L,-3.868105354403065333804959405965295962871E-23L, 1.957294039628045847156851410307133941611E-20L,-8.220635246181818130416407184286068307901E-18L, 2.811457254345322887443598804951004537784E-15L,-7.647163731819815869711749952353081768709E-13L, 1.605904383682161459812515654720205050216E-10L,-2.505210838544171877505034150892770940116E-8L, 2.755731922398589065255731765498970284004E-6L,-1.984126984126984126984126984045294307281E-4L, 8.333333333333333333333333333333119885283E-3L,-1.666666666666666666666666666666666647199E-1L};/* cos(x) = 1 - .5 x^2 + x^2 (x^2 P(x^2)) * Theoretical peak relative error = 2.1e-37, * relative peak error spread = 1.4e-8 */static long double coscof[11] = { 1.601961934248327059668321782499768648351E-24L,-8.896621117922334603659240022184527001401E-22L, 4.110317451243694098169570731967589555498E-19L,-1.561920696747074515985647487260202922160E-16L, 4.779477332386900932514186378501779328195E-14L,-1.147074559772972328629102981460088437917E-11L, 2.087675698786809897637922200570559726116E-9L,-2.755731922398589065255365968070684102298E-7L, 2.480158730158730158730158440896461945271E-5L,-1.388888888888888888888888888765724370132E-3L, 4.166666666666666666666666666666459301466E-2L};/*static long double DP1 = 7.853981554508209228515625E-1L;static long double DP2 =  7.94662735614792836713604629039764404296875E-9L;static long double DP3 = 3.0616169978683829430651648306875026455243736148E-17L;static long double lossth = 5.49755813888e11L;*/static long double DP1 = 7.853981633974483067550664827649598009884357452392578125E-1L;static long double DP2 = 2.8605943630549158983813312792950660807511260829685741796657E-18L;static long double DP3 = 2.1679525325309452561992610065108379921905808E-35L;static long double lossth =  3.6028797018963968E16L; /* 2^55 */extern long double PIO4L;long double sinl(x)long double x;{long double y, z, zz;int j, sign;long double polevll(), floorl(), ldexpl();/* make argument positive but save the sign */sign = 1;if( x < 0 )	{	x = -x;	sign = -1;	}if( x > lossth )	{	mtherr( "sinl", TLOSS );	return(0.0L);	}y = floorl( x/PIO4L ); /* integer part of x/PIO4 *//* strip high bits of integer part to prevent integer overflow */z = ldexpl( y, -4 );z = floorl(z);           /* integer part of y/8 */z = y - ldexpl( z, 4 );  /* y - 16 * (y/16) */j = z; /* convert to integer for tests on the phase angle *//* map zeros to origin */if( j & 1 )	{	j += 1;	y += 1.0L;	}j = j & 07; /* octant modulo 360 degrees *//* reflect in x axis */if( j > 3)	{	sign = -sign;	j -= 4;	}/* Extended precision modular arithmetic */z = ((x - y * DP1) - y * DP2) - y * DP3;zz = z * z;if( (j==1) || (j==2) )	{	y = 1.0L - ldexpl(zz,-1) + zz * zz * polevll( zz, coscof, 10 );	}else	{	y = z  +  z * (zz * polevll( zz, sincof, 11 ));	}if(sign < 0)	y = -y;return(y);}long double cosl(x)long double x;{long double y, z, zz;long i;int j, sign;long double polevll(), floorl(), ldexpl();/* make argument positive */sign = 1;if( x < 0 )	x = -x;if( x > lossth )	{	mtherr( "cosl", TLOSS );	return(0.0L);	}y = floorl( x/PIO4L );z = ldexpl( y, -4 );z = floorl(z);		/* integer part of y/8 */z = y - ldexpl( z, 4 );  /* y - 16 * (y/16) *//* integer and fractional part modulo one octant */i = z;if( i & 1 )	/* map zeros to origin */	{	i += 1;	y += 1.0L;	}j = i & 07;if( j > 3)	{	j -=4;	sign = -sign;	}if( j > 1 )	sign = -sign;/* Extended precision modular arithmetic */z = ((x - y * DP1) - y * DP2) - y * DP3;zz = z * z;if( (j==1) || (j==2) )	{	y = z  +  z * (zz * polevll( zz, sincof, 11 ));	}else	{	y = 1.0L - ldexpl(zz,-1) + zz * zz * polevll( zz, coscof, 10 );	}if(sign < 0)	y = -y;return(y);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -