float sinf(float x) { float y[2],z=0.0; int32_t n, ix; GET_FLOAT_WORD(ix,x); /* |x| ~< pi/4 */ ix &= 0x7fffffff; if(ix <= 0x3f490fd8) return __kernel_sinf(x,z,0); /* sin(Inf or NaN) is NaN */ else if (ix>=0x7f800000) return x-x; /* argument reduction needed */ else { n = __ieee754_rem_pio2f(x,y); switch(n&3) { case 0: return __kernel_sinf(y[0],y[1],1); case 1: return __kernel_cosf(y[0],y[1]); case 2: return -__kernel_sinf(y[0],y[1],1); default: return -__kernel_cosf(y[0],y[1]); } } }
void SINCOSF_FUNC (float x, float *sinx, float *cosx) { int32_t ix; /* High word of x. */ GET_FLOAT_WORD (ix, x); /* |x| ~< pi/4 */ ix &= 0x7fffffff; if (ix <= 0x3f490fd8) { *sinx = __kernel_sinf (x, 0.0, 0); *cosx = __kernel_cosf (x, 0.0); } else if (ix>=0x7f800000) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; if (ix == 0x7f800000) __set_errno (EDOM); } else { /* Argument reduction needed. */ float y[2]; int n; n = __ieee754_rem_pio2f (x, y); switch (n & 3) { case 0: *sinx = __kernel_sinf (y[0], y[1], 1); *cosx = __kernel_cosf (y[0], y[1]); break; case 1: *sinx = __kernel_cosf (y[0], y[1]); *cosx = -__kernel_sinf (y[0], y[1], 1); break; case 2: *sinx = -__kernel_sinf (y[0], y[1], 1); *cosx = -__kernel_cosf (y[0], y[1]); break; default: *sinx = -__kernel_cosf (y[0], y[1]); *cosx = __kernel_sinf (y[0], y[1], 1); break; } } }
static float sin_pif (float x) { float y = 0; float z = 0; __int32_t n = 0; __int32_t ix = 0; do { ieee_float_shape_type gf_u = { 0 }; (ix) = gf_u.word; } while (0); if (z == y) { if (ix < 0x4b800000) { if (ix < 0x4b000000) z = y + two23; do { ieee_float_shape_type gf_u; gf_u.value = (z); (n) = gf_u.word; } while (0); } } if (n == 0) y = __kernel_sinf (pi * y, zero, 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_sinf(pi*x,zero,0); 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_sinf(pi*y,zero,0); break; case 1: case 2: y = __kernel_cosf(pi*((float)0.5-y),zero); break; case 3: case 4: y = __kernel_sinf(pi*(one-y),zero,0); break; case 5: case 6: y = -__kernel_cosf(pi*(y-(float)1.5),zero); break; default: y = __kernel_sinf(pi*(y-(float)2.0),zero,0); break; } return -y; }
float __cosf (float x) { float y[2], z = 0.0; float ix; int32_t n; ix = __builtin_fabsf (x); /* |x| ~< pi/4 */ if (ix <= pio4) { return __kernel_cosf (x, z); /* cos(Inf or NaN) is NaN */ } else if (isnanf (ix)) { return x - x; } else if (isinff (ix)) { __set_errno (EDOM); return x - x; } /* argument reduction needed */ else { n = __ieee754_rem_pio2f (x, y); switch (n & 3) { case 0: return __kernel_cosf (y[0], y[1]); case 1: return -__kernel_sinf (y[0], y[1], 1); case 2: return -__kernel_cosf (y[0], y[1]); default: return __kernel_sinf (y[0], y[1], 1); } } }
//------------------------------------------------------------------------------ float Cmath::sin_pif( float x ) { static const float two23 =8.3886080000e+06; // 0x4b000000 static const float half = 5.0000000000e-01; // 0x3f000000 static const float one = 1.0000000000e+00; // 0x3f800000 static const float pi = 3.1415927410e+00; // 0x40490fdb static const float a0 = 7.7215664089e-02; // 0x3d9e233f static const float a1 = 3.2246702909e-01; // 0x3ea51a66 static const float a2 = 6.7352302372e-02; // 0x3d89f001 static const float a3 = 2.0580807701e-02; // 0x3ca89915 static const float a4 = 7.3855509982e-03; // 0x3bf2027e static const float a5 = 2.8905137442e-03; // 0x3b3d6ec6 static const float a6 = 1.1927076848e-03; // 0x3a9c54a1 static const float a7 = 5.1006977446e-04; // 0x3a05b634 static const float a8 = 2.2086278477e-04; // 0x39679767 static const float a9 = 1.0801156895e-04; // 0x38e28445 static const float a10 = 2.5214456400e-05; // 0x37d383a2 static const float a11 = 4.4864096708e-05; // 0x383c2c75 static const float tc = 1.4616321325e+00; // 0x3fbb16c3 static const float tf = -1.2148628384e-01; // 0xbdf8cdcd // tt = -(tail of tf) static const float tt = 6.6971006518e-09; // 0x31e61c52 static const float t0 = 4.8383611441e-01; // 0x3ef7b95e static const float t1 = -1.4758771658e-01; // 0xbe17213c static const float t2 = 6.4624942839e-02; // 0x3d845a15 static const float t3 = -3.2788541168e-02; // 0xbd064d47 static const float t4 = 1.7970675603e-02; // 0x3c93373d static const float t5 = -1.0314224288e-02; // 0xbc28fcfe static const float t6 = 6.1005386524e-03; // 0x3bc7e707 static const float t7 = -3.6845202558e-03; // 0xbb7177fe static const float t8 = 2.2596477065e-03; // 0x3b141699 static const float t9 = -1.4034647029e-03; // 0xbab7f476 static const float t10 = 8.8108185446e-04; // 0x3a66f867 static const float t11 = -5.3859531181e-04; // 0xba0d3085 static const float t12 = 3.1563205994e-04; // 0x39a57b6b static const float t13 = -3.1275415677e-04; // 0xb9a3f927 static const float t14 = 3.3552918467e-04; // 0x39afe9f7 static const float u0 = -7.7215664089e-02; // 0xbd9e233f static const float u1 = 6.3282704353e-01; // 0x3f2200f4 static const float u2 = 1.4549225569e+00; // 0x3fba3ae7 static const float u3 = 9.7771751881e-01; // 0x3f7a4bb2 static const float u4 = 2.2896373272e-01; // 0x3e6a7578 static const float u5 = 1.3381091878e-02; // 0x3c5b3c5e static const float v1 = 2.4559779167e+00; // 0x401d2ebe static const float v2 = 2.1284897327e+00; // 0x4008392d static const float v3 = 7.6928514242e-01; // 0x3f44efdf static const float v4 = 1.0422264785e-01; // 0x3dd572af static const float v5 = 3.2170924824e-03; // 0x3b52d5db static const float s0 = -7.7215664089e-02; // 0xbd9e233f static const float s1 = 2.1498242021e-01; // 0x3e5c245a static const float s2 = 3.2577878237e-01; // 0x3ea6cc7a static const float s3 = 1.4635047317e-01; // 0x3e15dce6 static const float s4 = 2.6642270386e-02; // 0x3cda40e4 static const float s5 = 1.8402845599e-03; // 0x3af135b4 static const float s6 = 3.1947532989e-05; // 0x3805ff67 static const float r1 = 1.3920053244e+00; // 0x3fb22d3b static const float r2 = 7.2193557024e-01; // 0x3f38d0c5 static const float r3 = 1.7193385959e-01; // 0x3e300f6e static const float r4 = 1.8645919859e-02; // 0x3c98bf54 static const float r5 = 7.7794247773e-04; // 0x3a4beed6 static const float r6 = 7.3266842264e-06; // 0x36f5d7bd static const float w0 = 4.1893854737e-01; // 0x3ed67f1d static const float w1 = 8.3333335817e-02; // 0x3daaaaab static const float w2 = -2.7777778450e-03; // 0xbb360b61 static const float w3 = 7.9365057172e-04; // 0x3a500cfd static const float w4 = -5.9518753551e-04; // 0xba1c065c static const float w5 = 8.3633989561e-04; // 0x3a5b3dd2 static const float w6 = -1.6309292987e-03; // 0xbad5c4e8 static const float zero= 0.0000000000e+00; float y,z; Cmp_signed__int32 n,ix; get_float_word( ix, x ); ix &= 0x7fffffff; if( ix < 0x3e800000 ) { return __kernel_sinf( pi * x, zero, 0 ); } 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 = (Cmp_signed__int32)( 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_sinf( pi * y, zero, 0 ); break; case 1: case 2: y = __kernel_cosf( pi * ( (float)0.5 - y ), zero ); break; case 3: case 4: y = __kernel_sinf( pi * ( one - y ), zero, 0 ); break; case 5: case 6: y = -__kernel_cosf( pi * ( y - (float)1.5 ), zero ); break; default: y = __kernel_sinf( pi * ( y - (float)2.0 ), zero, 0 ); break; } return -y; }