/* tan.c
*
* Circular tangent
*
*
*
* SYNOPSIS :
*
* double x , y , tan ( ) ;
*
* y = tan ( x ) ;
*
*
*
* DESCRIPTION :
*
* Returns the circular tangent of the radian argument x .
*
* Range reduction is modulo pi / 4 . A rational function
* x + x * * 3 P ( x * * 2 ) / Q ( x * * 2 )
* is employed in the basic interval [ 0 , pi / 4 ] .
*
*
*
* ACCURACY :
*
* Relative error :
* arithmetic domain # trials peak rms
* DEC + - 1 . 07 e9 44000 4 . 1 e - 17 1 . 0 e - 17
* IEEE + - 1 . 07 e9 30000 2 . 9 e - 16 8 . 1 e - 17
*
* ERROR MESSAGES :
*
* message condition value returned
* tan total loss x > 1 . 073741824 e9 0 . 0
*
*/
/* cot.c
*
* Circular cotangent
*
*
*
* SYNOPSIS :
*
* double x , y , cot ( ) ;
*
* y = cot ( x ) ;
*
*
*
* DESCRIPTION :
*
* Returns the circular cotangent of the radian argument x .
*
* Range reduction is modulo pi / 4 . A rational function
* x + x * * 3 P ( x * * 2 ) / Q ( x * * 2 )
* is employed in the basic interval [ 0 , pi / 4 ] .
*
*
*
* ACCURACY :
*
* Relative error :
* arithmetic domain # trials peak rms
* IEEE + - 1 . 07 e9 30000 2 . 9 e - 16 8 . 2 e - 17
*
*
* ERROR MESSAGES :
*
* message condition value returned
* cot total loss x > 1 . 073741824 e9 0 . 0
* cot singularity x = 0 INFINITY
*
*/
/*
Cephes Math Library Release 2 . 8 : June , 2000
yright 1984 , 1995 , 2000 by Stephen L . Moshier
*/
#include "mconf.h"
#ifdef UNK
static double P[] = {
-1 .30936939181383777646 E4,
1 .15351664838587416140 E6,
-1 .79565251976484877988 E7
};
static double Q[] = {
/* 1.00000000000000000000E0,*/
1 .36812963470692954678 E4,
-1 .32089234440210967447 E6,
2 .50083801823357915839 E7,
-5 .38695755929454629881 E7
};
static double DP1 = 7 .853981554508209228515625 E-1 ;
static double DP2 = 7 .94662735614792836714 E-9 ;
static double DP3 = 3 .06161699786838294307 E-17 ;
static double lossth = 1 .073741824 e9;
#endif
#ifdef DEC
static unsigned short P[] = {
0143514 ,0113306 ,0111171 ,0174674 ,
0045214 ,0147545 ,0027744 ,0167346 ,
0146210 ,0177526 ,0114514 ,0105660
};
static unsigned short Q[] = {
/*0040200,0000000,0000000,0000000,*/
0043525 ,0142457 ,0072633 ,0025617 ,
0145241 ,0036742 ,0140525 ,0162256 ,
0046276 ,0146176 ,0013526 ,0143573 ,
0146515 ,0077401 ,0162762 ,0150607
};
/* 7.853981629014015197753906250000E-1 */
static unsigned short P1[] = {0040111 ,0007732 ,0120000 ,0000000 ,};
/* 4.960467869796758577649598009884E-10 */
static unsigned short P2[] = {0030410 ,0055060 ,0100000 ,0000000 ,};
/* 2.860594363054915898381331279295E-18 */
static unsigned short P3[] = {0021523 ,0011431 ,0105056 ,0001560 ,};
#define DP1 *(double *)P1
#define DP2 *(double *)P2
#define DP3 *(double *)P3
static double lossth = 1 .073741824 e9;
#endif
#ifdef IBMPC
static unsigned short P[] = {
0 x3f38,0 xd24f,0 x92d8,0 xc0c9,
0 x9ddd,0 xa5fc,0 x99ec,0 x4131,
0 x9176,0 xd329,0 x1fea,0 xc171
};
static unsigned short Q[] = {
/*0x0000,0x0000,0x0000,0x3ff0,*/
0 x6572,0 xeeb3,0 xb8a5,0 x40ca,
0 xbc96,0 x582a,0 x27bc,0 xc134,
0 xd8ef,0 xc2ea,0 xd98f,0 x4177,
0 x5a31,0 x3cbe,0 xafe0,0 xc189
};
/*
7 . 85398125648498535156 E - 1 ,
3 . 77489470793079817668 E - 8 ,
2 . 69515142907905952645 E - 15 ,
*/
static unsigned short P1[] = {0 x0000,0 x4000,0 x21fb,0 x3fe9};
static unsigned short P2[] = {0 x0000,0 x0000,0 x442d,0 x3e64};
static unsigned short P3[] = {0 x5170,0 x98cc,0 x4698,0 x3ce8};
#define DP1 *(double *)P1
#define DP2 *(double *)P2
#define DP3 *(double *)P3
static double lossth = 1 .073741824 e9;
#endif
#ifdef MIEEE
static unsigned short P[] = {
0 xc0c9,0 x92d8,0 xd24f,0 x3f38,
0 x4131,0 x99ec,0 xa5fc,0 x9ddd,
0 xc171,0 x1fea,0 xd329,0 x9176
};
static unsigned short Q[] = {
0 x40ca,0 xb8a5,0 xeeb3,0 x6572,
0 xc134,0 x27bc,0 x582a,0 xbc96,
0 x4177,0 xd98f,0 xc2ea,0 xd8ef,
0 xc189,0 xafe0,0 x3cbe,0 x5a31
};
static unsigned short P1[] = {
0 x3fe9,0 x21fb,0 x4000,0 x0000
};
static unsigned short P2[] = {
0 x3e64,0 x442d,0 x0000,0 x0000
};
static unsigned short P3[] = {
0 x3ce8,0 x4698,0 x98cc,0 x5170,
};
#define DP1 *(double *)P1
#define DP2 *(double *)P2
#define DP3 *(double *)P3
static double lossth = 1 .073741824 e9;
#endif
#ifdef ANSIPROT
extern double polevl ( double , void *, int );
extern double p1evl ( double , void *, int );
extern double floor ( double );
extern double ldexp ( double , int );
extern int isnan ( double );
extern int isfinite ( double );
static double tancot(double , int );
#else
double polevl(), p1evl(), floor(), ldexp();
static double tancot();
int isnan(), isfinite();
#endif
extern double PIO4;
extern double INFINITY;
extern double NAN;
double tan(x)
double x;
{
#ifdef MINUSZERO
if ( x == 0 .0 )
return (x);
#endif
#ifdef NANS
if ( isnan(x) )
return (x);
if ( !isfinite(x) )
{
mtherr( "tan" , DOMAIN );
return (NAN);
}
#endif
return ( tancot(x,0 ) );
}
double cot(x)
double x;
{
if ( x == 0 .0 )
{
mtherr( "cot" , SING );
return ( INFINITY );
}
return ( tancot(x,1 ) );
}
static double tancot( xx, cotflg )
double xx;
int cotflg;
{
double x, y, z, zz;
int j, sign;
/* make argument positive but save the sign */
if ( xx < 0 )
{
x = -xx;
sign = -1 ;
}
else
{
x = xx;
sign = 1 ;
}
if ( x > lossth )
{
if ( cotflg )
mtherr( "cot" , TLOSS );
else
mtherr( "tan" , TLOSS );
return (0 .0 );
}
/* compute x mod PIO4 */
y = floor( x/PIO4 );
/* strip high bits of integer part */
z = ldexp( y, -3 );
z = floor(z); /* integer part of y/8 */
z = y - ldexp( z, 3 ); /* y - 16 * (y/16) */
/* integer and fractional part modulo one octant */
j = z;
/* map zeros and singularities to origin */
if ( j & 1 )
{
j += 1 ;
y += 1 .0 ;
}
z = ((x - y * DP1) - y * DP2) - y * DP3;
zz = z * z;
if ( zz > 1 .0 e-14 )
y = z + z * (zz * polevl( zz, P, 2 )/p1evl(zz, Q, 4 ));
else
y = z;
if ( j & 2 )
{
if ( cotflg )
y = -y;
else
y = -1 .0 /y;
}
else
{
if ( cotflg )
y = 1 .0 /y;
}
if ( sign < 0 )
y = -y;
return ( y );
}
Messung V0.5 in Prozent C=95 H=100 G=97
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-17)
¤
*© Formatika GbR, Deutschland