Пример #1
0
double
sin(double x)
{
	double y[2],z=0.0;
	int32_t n, ix;

    /* High word of x. */
	GET_HIGH_WORD(ix,x);

    /* |x| ~< pi/4 */
	ix &= 0x7fffffff;
	if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0);

    /* sin(Inf or NaN) is NaN */
	else if (ix>=0x7ff00000) return x-x;

    /* argument reduction needed */
	else {
	    n = __libm_rem_pio2(x,y);
	    switch(n&3) {
		case 0: return  __kernel_sin(y[0],y[1],1);
		case 1: return  __kernel_cos(y[0],y[1]);
		case 2: return -__kernel_sin(y[0],y[1],1);
		default:
			return -__kernel_cos(y[0],y[1]);
	    }
	}
}
Пример #2
0
double
sin(double x)
{
	double y[2],z=0.0;
	int32_t n, ix;

    /* High word of x. */
	GET_HIGH_WORD(ix,x);

    /* |x| ~< pi/4 */
	ix &= 0x7fffffff;
	if(ix <= 0x3fe921fb) {
	    if(ix<0x3e500000)			/* |x| < 2**-26 */
	       {if((int)x==0) return x;}	/* generate inexact */
	    return __kernel_sin(x,z,0);
	}

    /* sin(Inf or NaN) is NaN */
	else if (ix>=0x7ff00000) return x-x;

    /* argument reduction needed */
	else {
	    n = __ieee754_rem_pio2(x,y);
	    switch(n&3) {
		case 0: return  __kernel_sin(y[0],y[1],1);
		case 1: return  __kernel_cos(y[0],y[1]);
		case 2: return -__kernel_sin(y[0],y[1],1);
		default:
			return -__kernel_cos(y[0],y[1]);
	    }
	}
}
Пример #3
0
double sin(double x)
{
	double y[2], z = 0.0;
	s32_t n, ix;

	GET_HIGH_WORD(ix,x);

	ix &= 0x7fffffff;
	if (ix <= 0x3fe921fb)
	{
		if (ix < 0x3e400000)
		{
			if ((int) x == 0)
				return x;
		}
		return __kernel_sin(x, z, 0);
	}
	else if (ix >= 0x7ff00000)
		return x - x;
	else
	{
		n = __ieee754_rem_pio2(x, y);
		switch (n & 3)
		{
		case 0:
			return __kernel_sin(y[0], y[1], 1);
		case 1:
			return __kernel_cos(y[0], y[1]);
		case 2:
			return -__kernel_sin(y[0], y[1], 1);
		default:
			return -__kernel_cos(y[0], y[1]);
		}
	}
}
Пример #4
0
double JFP_lib_sin(double x) {
    double y[2];
    int n, ix;

    /* High word of x. */
    ix = __HI(x);

    /* |x| ~< pi/4 */
    ix &= 0x7fffffff;
    if(ix <= 0x3fe921fb) return __kernel_sin(x,0,0);

    /* sin(Inf or NaN) is NaN */
    else if (ix>=0x7ff00000) return x-x;

    /* argument reduction needed */
    else {
        n = __ieee754_rem_pio2(x,y);
        switch(n&3) {
        case 0: return  __kernel_sin(y[0],y[1],1);
        case 1: return  __kernel_cos(y[0],y[1]);
        case 2: return -__kernel_sin(y[0],y[1],1);
        default:
            return -__kernel_cos(y[0],y[1]);
        }
    }
}
Пример #5
0
static
#ifdef __GNUC__
__inline__
#endif
double sin_pi(double x)
{
	double y,z;
	int n,ix;

	GET_HIGH_WORD(ix,x);
	ix &= 0x7fffffff;

	if(ix<0x3fd00000) return __kernel_sin(pi*x,zero,0);
	y = -x;		/* x is assume negative */

    /*
     * argument reduction, make sure inexact flag not raised if input
     * is an integer
     */
	z = floor(y);
	if(z!=y) {				/* inexact anyway */
	    y  *= 0.5;
	    y   = 2.0*(y - floor(y));		/* y = |x| mod 2.0 */
	    n   = (int) (y*4.0);
	} else {
            if(ix>=0x43400000) {
                y = zero; n = 0;                 /* y must be even */
            } else {
                if(ix<0x43300000) z = y+two52;	/* exact */
		GET_LOW_WORD(n,z);
		n &= 1;
                y  = n;
                n<<= 2;
            }
        }
	switch (n) {
	    case 0:   y =  __kernel_sin(pi*y,zero,0); break;
	    case 1:
	    case 2:   y =  __kernel_cos(pi*(0.5-y),zero); break;
	    case 3:
	    case 4:   y =  __kernel_sin(pi*(one-y),zero,0); break;
	    case 5:
	    case 6:   y = -__kernel_cos(pi*(y-1.5),zero); break;
	    default:  y =  __kernel_sin(pi*(y-2.0),zero,0); break;
	    }
	return -y;
}
Пример #6
0
EXPORT_C double cos(double x)
{
	double y[2],z=0.0;
	int32_t n, ix;

    /* High word of x. */
	GET_HIGH_WORD(ix,x);

    /* |x| ~< pi/4 */
	ix &= 0x7fffffff;
	if(ix <= 0x3fe921fb) return __kernel_cos(x,z);

    /* cos(Inf or NaN) is NaN */
  else if (ix>=0x7ff00000) 
  #ifdef __SYMBIAN32__
		return NAN;
	#else 
    return x-x;
  #endif //__SYMBIAN32__

    /* argument reduction needed */
	else {
Пример #7
0
    //------------------------------------------------------------------------------
    double Cmath::sin_pi( double x )
    {
        static const double two52=  4.50359962737049600000e+15; // 0x43300000, 0x00000000
        static const double half=  5.00000000000000000000e-01; // 0x3FE00000, 0x00000000
        static const double one =  1.00000000000000000000e+00; // 0x3FF00000, 0x00000000
        static const double pi  =  3.14159265358979311600e+00; // 0x400921FB, 0x54442D18
        static const double a0  =  7.72156649015328655494e-02; // 0x3FB3C467, 0xE37DB0C8
        static const double a1  =  3.22467033424113591611e-01; // 0x3FD4A34C, 0xC4A60FAD
        static const double a2  =  6.73523010531292681824e-02; // 0x3FB13E00, 0x1A5562A7
        static const double a3  =  2.05808084325167332806e-02; // 0x3F951322, 0xAC92547B
        static const double a4  =  7.38555086081402883957e-03; // 0x3F7E404F, 0xB68FEFE8
        static const double a5  =  2.89051383673415629091e-03; // 0x3F67ADD8, 0xCCB7926B
        static const double a6  =  1.19270763183362067845e-03; // 0x3F538A94, 0x116F3F5D
        static const double a7  =  5.10069792153511336608e-04; // 0x3F40B6C6, 0x89B99C00
        static const double a8  =  2.20862790713908385557e-04; // 0x3F2CF2EC, 0xED10E54D
        static const double a9  =  1.08011567247583939954e-04; // 0x3F1C5088, 0x987DFB07
        static const double a10 =  2.52144565451257326939e-05; // 0x3EFA7074, 0x428CFA52
        static const double a11 =  4.48640949618915160150e-05; // 0x3F07858E, 0x90A45837
        static const double tc  =  1.46163214496836224576e+00; // 0x3FF762D8, 0x6356BE3F
        static const double tf  = -1.21486290535849611461e-01; // 0xBFBF19B9, 0xBCC38A42
        // tt = -(tail of tf)
        static const double tt  = -3.63867699703950536541e-18; // 0xBC50C7CA, 0xA48A971F
        static const double t0  =  4.83836122723810047042e-01; // 0x3FDEF72B, 0xC8EE38A2
        static const double t1  = -1.47587722994593911752e-01; // 0xBFC2E427, 0x8DC6C509
        static const double t2  =  6.46249402391333854778e-02; // 0x3FB08B42, 0x94D5419B
        static const double t3  = -3.27885410759859649565e-02; // 0xBFA0C9A8, 0xDF35B713
        static const double t4  =  1.79706750811820387126e-02; // 0x3F9266E7, 0x970AF9EC
        static const double t5  = -1.03142241298341437450e-02; // 0xBF851F9F, 0xBA91EC6A
        static const double t6  =  6.10053870246291332635e-03; // 0x3F78FCE0, 0xE370E344
        static const double t7  = -3.68452016781138256760e-03; // 0xBF6E2EFF, 0xB3E914D7
        static const double t8  =  2.25964780900612472250e-03; // 0x3F6282D3, 0x2E15C915
        static const double t9  = -1.40346469989232843813e-03; // 0xBF56FE8E, 0xBF2D1AF1
        static const double t10 =  8.81081882437654011382e-04; // 0x3F4CDF0C, 0xEF61A8E9
        static const double t11 = -5.38595305356740546715e-04; // 0xBF41A610, 0x9C73E0EC
        static const double t12 =  3.15632070903625950361e-04; // 0x3F34AF6D, 0x6C0EBBF7
        static const double t13 = -3.12754168375120860518e-04; // 0xBF347F24, 0xECC38C38
        static const double t14 =  3.35529192635519073543e-04; // 0x3F35FD3E, 0xE8C2D3F4
        static const double u0  = -7.72156649015328655494e-02; // 0xBFB3C467, 0xE37DB0C8
        static const double u1  =  6.32827064025093366517e-01; // 0x3FE4401E, 0x8B005DFF
        static const double u2  =  1.45492250137234768737e+00; // 0x3FF7475C, 0xD119BD6F
        static const double u3  =  9.77717527963372745603e-01; // 0x3FEF4976, 0x44EA8450
        static const double u4  =  2.28963728064692451092e-01; // 0x3FCD4EAE, 0xF6010924
        static const double u5  =  1.33810918536787660377e-02; // 0x3F8B678B, 0xBF2BAB09
        static const double v1  =  2.45597793713041134822e+00; // 0x4003A5D7, 0xC2BD619C
        static const double v2  =  2.12848976379893395361e+00; // 0x40010725, 0xA42B18F5
        static const double v3  =  7.69285150456672783825e-01; // 0x3FE89DFB, 0xE45050AF
        static const double v4  =  1.04222645593369134254e-01; // 0x3FBAAE55, 0xD6537C88
        static const double v5  =  3.21709242282423911810e-03; // 0x3F6A5ABB, 0x57D0CF61
        static const double s0  = -7.72156649015328655494e-02; // 0xBFB3C467, 0xE37DB0C8
        static const double s1  =  2.14982415960608852501e-01; // 0x3FCB848B, 0x36E20878
        static const double s2  =  3.25778796408930981787e-01; // 0x3FD4D98F, 0x4F139F59
        static const double s3  =  1.46350472652464452805e-01; // 0x3FC2BB9C, 0xBEE5F2F7
        static const double s4  =  2.66422703033638609560e-02; // 0x3F9B481C, 0x7E939961
        static const double s5  =  1.84028451407337715652e-03; // 0x3F5E26B6, 0x7368F239
        static const double s6  =  3.19475326584100867617e-05; // 0x3F00BFEC, 0xDD17E945
        static const double r1  =  1.39200533467621045958e+00; // 0x3FF645A7, 0x62C4AB74
        static const double r2  =  7.21935547567138069525e-01; // 0x3FE71A18, 0x93D3DCDC
        static const double r3  =  1.71933865632803078993e-01; // 0x3FC601ED, 0xCCFBDF27
        static const double r4  =  1.86459191715652901344e-02; // 0x3F9317EA, 0x742ED475
        static const double r5  =  7.77942496381893596434e-04; // 0x3F497DDA, 0xCA41A95B
        static const double r6  =  7.32668430744625636189e-06; // 0x3EDEBAF7, 0xA5B38140
        static const double w0  =  4.18938533204672725052e-01; // 0x3FDACFE3, 0x90C97D69
        static const double w1  =  8.33333333333329678849e-02; // 0x3FB55555, 0x5555553B
        static const double w2  = -2.77777777728775536470e-03; // 0xBF66C16C, 0x16B02E5C
        static const double w3  =  7.93650558643019558500e-04; // 0x3F4A019F, 0x98CF38B6
        static const double w4  = -5.95187557450339963135e-04; // 0xBF4380CB, 0x8C0FE741
        static const double w5  =  8.36339918996282139126e-04; // 0x3F4B67BA, 0x4CDAD5D1
        static const double w6  = -1.63092934096575273989e-03; // 0xBF5AB89D, 0x0B9E43E4
        static const double zero = 0.00000000000000000000e+00;

        double y, z;
        Cmp_signed__int32 n, ix;

        get_high_word( ix, x );
        ix &= 0x7fffffff;

        if( ix < 0x3fd00000 )
        {
            return __kernel_sin( pi * x, zero, 0 );
        }
        y = -x;		// x is assume negative

        //argument reduction, make sure inexact flag not raised if input is an integer

        z = floor( y );
        if( z != y )
        {
            // inexact anyway
            y *= 0.5;
            y = 2.0 * ( y - floor( y ) ); // y = |x| mod 2.0
            n = (Cmp_signed__int32)( y * 4.0 );
        }
        else
        {
            if( ix >= 0x43400000 )
            {
                y = zero;
                n = 0; // y must be even
            }
            else
            {
                if( ix < 0x43300000 )
                {
                    z = y + two52; // exact
                }
                get_low_word( n, z );
                n &= 1;
                y = n;
                n <<= 2;
            }
        }

        switch( n )
        {
        case 0:   y = __kernel_sin( pi * y, zero, 0 );
            break;
        case 1:
        case 2:   y = __kernel_cos( pi * ( 0.5 - y ), zero );
            break;
        case 3:
        case 4:   y = __kernel_sin( pi * ( one - y ), zero, 0 );
            break;
        case 5:
        case 6:   y = -__kernel_cos( pi * ( y - 1.5 ), zero );
            break;
        default:  y = __kernel_sin( pi * ( y - 2.0 ), zero, 0 );
            break;
        }
        return -y;
    }