Exemplo n.º 1
0
float
cosf(float x)
{
    float y[2];
    int32_t n, hx, ix;

    GET_FLOAT_WORD(hx,x);
    ix = hx & 0x7fffffff;

    if(ix <= 0x3f490fda) {		/* |x| ~<= pi/4 */
        if(ix<0x39800000)		/* |x| < 2**-12 */
            if(((int)x)==0) return 1.0;	/* 1 with inexact if x != 0 */
        return __kernel_cosdf(x);
    }
    if(ix<=0x407b53d1) {		/* |x| ~<= 5*pi/4 */
        if(ix>0x4016cbe3)		/* |x|  ~> 3*pi/4 */
            return -__kernel_cosdf(x + (hx > 0 ? -c2pio2 : c2pio2));
        else {
            if(hx>0)
                return __kernel_sindf(c1pio2 - x);
            else
                return __kernel_sindf(x + c1pio2);
        }
    }
    if(ix<=0x40e231d5) {		/* |x| ~<= 9*pi/4 */
        if(ix>0x40afeddf)		/* |x|  ~> 7*pi/4 */
            return __kernel_cosdf(x + (hx > 0 ? -c4pio2 : c4pio2));
        else {
            if(hx>0)
                return __kernel_sindf(x - c3pio2);
            else
                return __kernel_sindf(-c3pio2 - x);
        }
    }

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

    /* general argument reduction needed */
    else {
        n = __ieee754_rem_pio2f(x,y);
        switch(n&3) {
        case 0:
            return  __kernel_cosdf((double)y[0]+y[1]);
        case 1:
            return  __kernel_sindf(-(double)y[0]-y[1]);
        case 2:
            return -__kernel_cosdf((double)y[0]+y[1]);
        default:
            return  __kernel_sindf((double)y[0]+y[1]);
        }
    }
}
Exemplo n.º 2
0
	static float sin_pif(float x)
{
	float y,z;
	int n,ix;

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

	if(ix<0x3e800000) return __kernel_sindf(pi*x);
	y = -x;		/* x is assume negative */

    /*
     * argument reduction, make sure inexact flag not raised if input
     * is an integer
     */
	z = floorf(y);
	if(z!=y) {				/* inexact anyway */
	    y  *= (float)0.5;
	    y   = (float)2.0*(y - floorf(y));	/* y = |x| mod 2.0 */
	    n   = (int) (y*(float)4.0);
	} else {
            if(ix>=0x4b800000) {
                y = zero; n = 0;                 /* y must be even */
            } else {
                if(ix<0x4b000000) z = y+two23;	/* exact */
		GET_FLOAT_WORD(n,z);
		n &= 1;
                y  = n;
                n<<= 2;
            }
        }
	switch (n) {
	    case 0:   y =  __kernel_sindf(pi*y); break;
	    case 1:
	    case 2:   y =  __kernel_cosdf(pi*((float)0.5-y)); break;
	    case 3:
	    case 4:   y =  __kernel_sindf(pi*(one-y)); break;
	    case 5:
	    case 6:   y = -__kernel_cosdf(pi*(y-(float)1.5)); break;
	    default:  y =  __kernel_sindf(pi*(y-(float)2.0)); break;
	    }
	return -y;
}
Exemplo n.º 3
0
static float
sin_pif(float x)
{
	volatile float vz;
	float y,z;
	int n;

	y = -x;

	vz = y+0x1p23F;			/* depend on 0 <= y < 0x1p23 */
	z = vz-0x1p23F;			/* rintf(y) for the above range */
	if (z == y)
	    return zero;

	vz = y+0x1p21F;
	GET_FLOAT_WORD(n,vz);		/* bits for rounded y (units 0.25) */
	z = vz-0x1p21F;			/* y rounded to a multiple of 0.25 */
	if (z > y) {
	    z -= 0.25F;			/* adjust to round down */
	    n--;
	}
	n &= 7;				/* octant of y mod 2 */
	y = y - z + n * 0.25F;		/* y mod 2 */

	switch (n) {
	    case 0:   y =  __kernel_sindf(pi*y); break;
	    case 1:
	    case 2:   y =  __kernel_cosdf(pi*((float)0.5-y)); break;
	    case 3:
	    case 4:   y =  __kernel_sindf(pi*(one-y)); break;
	    case 5:
	    case 6:   y = -__kernel_cosdf(pi*(y-(float)1.5)); break;
	    default:  y =  __kernel_sindf(pi*(y-(float)2.0)); break;
	    }
	return -y;
}
Exemplo n.º 4
0
float
sinf(float x)
{
    double y;
    int32_t n, hx, ix;

    GET_FLOAT_WORD(hx,x);
    ix = hx & 0x7fffffff;

    if(ix <= 0x3f490fda) {		/* |x| ~<= pi/4 */
        if(ix<0x39800000)		/* |x| < 2**-12 */
            if(((int)x)==0) return x;	/* x with inexact if x != 0 */
        return __kernel_sindf(x);
    }
    if(ix<=0x407b53d1) {		/* |x| ~<= 5*pi/4 */
        if(ix<=0x4016cbe3) {	/* |x| ~<= 3pi/4 */
            if(hx>0)
                return __kernel_cosdf(x - s1pio2);
            else
                return -__kernel_cosdf(x + s1pio2);
        } else
            return __kernel_sindf((hx > 0 ? s2pio2 : -s2pio2) - x);
    }
    if(ix<=0x40e231d5) {		/* |x| ~<= 9*pi/4 */
        if(ix<=0x40afeddf) {	/* |x| ~<= 7*pi/4 */
            if(hx>0)
                return -__kernel_cosdf(x - s3pio2);
            else
                return __kernel_cosdf(x + s3pio2);
        } else
            return __kernel_sindf(x + (hx > 0 ? -s4pio2 : s4pio2));
    }

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

    /* general argument reduction needed */
    else {
        n = __ieee754_rem_pio2f(x,&y);
        switch(n&3) {
        case 0:
            return  __kernel_sindf(y);
        case 1:
            return  __kernel_cosdf(y);
        case 2:
            return  __kernel_sindf(-y);
        default:
            return -__kernel_cosdf(y);
        }
    }
}