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]); } } }
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]); } } }
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]); } } }
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]); } } }
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; }
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 {
//------------------------------------------------------------------------------ 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; }