ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

j1_y1.c
Go to the documentation of this file.
00001 /* @(#)e_j1.c 5.1 93/09/24 */
00002 /*
00003  * ====================================================
00004  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
00005  *
00006  * Developed at SunPro, a Sun Microsystems, Inc. business.
00007  * Permission to use, copy, modify, and distribute this
00008  * software is freely granted, provided that this notice
00009  * is preserved.
00010  * ====================================================
00011  */
00012 /* Modified by Naohiko Shimizu/Tokai University, Japan 1997/08/26,
00013    for performance improvement on pipelined processors.
00014 */
00015 
00016 #if defined(LIBM_SCCS) && !defined(lint)
00017 static char rcsid[] = "$NetBSD: e_j1.c,v 1.8 1995/05/10 20:45:27 jtc Exp $";
00018 #endif
00019 
00020 /* __ieee754_j1(x), __ieee754_y1(x)
00021  * Bessel function of the first and second kinds of order zero.
00022  * Method -- j1(x):
00023  *  1. For tiny x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ...
00024  *  2. Reduce x to |x| since j1(x)=-j1(-x),  and
00025  *     for x in (0,2)
00026  *      j1(x) = x/2 + x*z*R0/S0,  where z = x*x;
00027  *     (precision:  |j1/x - 1/2 - R0/S0 |<2**-61.51 )
00028  *     for x in (2,inf)
00029  *      j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1))
00030  *      y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
00031  *     where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
00032  *     as follow:
00033  *      cos(x1) =  cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
00034  *          =  1/sqrt(2) * (sin(x) - cos(x))
00035  *      sin(x1) =  sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
00036  *          = -1/sqrt(2) * (sin(x) + cos(x))
00037  *     (To avoid cancellation, use
00038  *      sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
00039  *      to compute the worse one.)
00040  *
00041  *  3 Special cases
00042  *      j1(nan)= nan
00043  *      j1(0) = 0
00044  *      j1(inf) = 0
00045  *
00046  * Method -- y1(x):
00047  *  1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN
00048  *  2. For x<2.
00049  *     Since
00050  *      y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...)
00051  *     therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function.
00052  *     We use the following function to approximate y1,
00053  *      y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2
00054  *     where for x in [0,2] (abs err less than 2**-65.89)
00055  *      U(z) = U0[0] + U0[1]*z + ... + U0[4]*z^4
00056  *      V(z) = 1  + v0[0]*z + ... + v0[4]*z^5
00057  *     Note: For tiny x, 1/x dominate y1 and hence
00058  *      y1(tiny) = -2/pi/tiny, (choose tiny<2**-54)
00059  *  3. For x>=2.
00060  *      y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
00061  *     where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
00062  *     by method mentioned above.
00063  */
00064 
00065 #include "math.h"
00066 #include "ieee754.h"
00067 
00068 #ifdef __STDC__
00069 static double pone(double), qone(double);
00070 #else
00071 static double pone(), qone();
00072 #endif
00073 
00074 #ifdef __STDC__
00075 static const double
00076 #else
00077 static double
00078 #endif
00079 huge    = 1e300,
00080 one = 1.0,
00081 invsqrtpi=  5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
00082 tpi      =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
00083     /* R0/S0 on [0,2] */
00084 R[]  = {-6.25000000000000000000e-02, /* 0xBFB00000, 0x00000000 */
00085   1.40705666955189706048e-03, /* 0x3F570D9F, 0x98472C61 */
00086  -1.59955631084035597520e-05, /* 0xBEF0C5C6, 0xBA169668 */
00087   4.96727999609584448412e-08}, /* 0x3E6AAAFA, 0x46CA0BD9 */
00088 S[]  =  {0.0, 1.91537599538363460805e-02, /* 0x3F939D0B, 0x12637E53 */
00089   1.85946785588630915560e-04, /* 0x3F285F56, 0xB9CDF664 */
00090   1.17718464042623683263e-06, /* 0x3EB3BFF8, 0x333F8498 */
00091   5.04636257076217042715e-09, /* 0x3E35AC88, 0xC97DFF2C */
00092   1.23542274426137913908e-11}; /* 0x3DAB2ACF, 0xCFB97ED8 */
00093 
00094 #ifdef __STDC__
00095 static const double zero    = 0.0;
00096 #else
00097 static double zero    = 0.0;
00098 #endif
00099 
00100 #ifdef __STDC__
00101     double __ieee754_j1(double x)
00102 #else
00103     double __ieee754_j1(x)
00104     double x;
00105 #endif
00106 {
00107     double z, s,c,ss,cc,r,u,v,y,r1,r2,s1,s2,s3,z2,z4;
00108     int32_t hx,ix;
00109 
00110     GET_HIGH_WORD(hx,x);
00111     ix = hx&0x7fffffff;
00112     if(ix>=0x7ff00000) return one/x;
00113     y = fabs(x);
00114     if(ix >= 0x40000000) {  /* |x| >= 2.0 */
00115         __sincos (y, &s, &c);
00116         ss = -s-c;
00117         cc = s-c;
00118         if(ix<0x7fe00000) {  /* make sure y+y not overflow */
00119             z = __cos(y+y);
00120             if ((s*c)>zero) cc = z/ss;
00121             else        ss = z/cc;
00122         }
00123     /*
00124      * j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
00125      * y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
00126      */
00127         if(ix>0x48000000) z = (invsqrtpi*cc)/__ieee754_sqrt(y);
00128         else {
00129             u = pone(y); v = qone(y);
00130             z = invsqrtpi*(u*cc-v*ss)/__ieee754_sqrt(y);
00131         }
00132         if(hx<0) return -z;
00133         else     return  z;
00134     }
00135     if(ix<0x3e400000) { /* |x|<2**-27 */
00136         if(huge+x>one) return 0.5*x;/* inexact if x!=0 necessary */
00137     }
00138     z = x*x;
00139 #ifdef DO_NOT_USE_THIS
00140     r =  z*(r00+z*(r01+z*(r02+z*r03)));
00141     s =  one+z*(s01+z*(s02+z*(s03+z*(s04+z*s05))));
00142     r *= x;
00143 #else
00144     r1 = z*R[0]; z2=z*z;
00145     r2 = R[1]+z*R[2]; z4=z2*z2;
00146     r = r1 + z2*r2 + z4*R[3];
00147     r *= x;
00148     s1 = one+z*S[1];
00149     s2 = S[2]+z*S[3];
00150     s3 = S[4]+z*S[5];
00151     s = s1 + z2*s2 + z4*s3;
00152 #endif
00153     return(x*0.5+r/s);
00154 }
00155 
00156 #ifdef __STDC__
00157 static const double U0[5] = {
00158 #else
00159 static double U0[5] = {
00160 #endif
00161  -1.96057090646238940668e-01, /* 0xBFC91866, 0x143CBC8A */
00162   5.04438716639811282616e-02, /* 0x3FA9D3C7, 0x76292CD1 */
00163  -1.91256895875763547298e-03, /* 0xBF5F55E5, 0x4844F50F */
00164   2.35252600561610495928e-05, /* 0x3EF8AB03, 0x8FA6B88E */
00165  -9.19099158039878874504e-08, /* 0xBE78AC00, 0x569105B8 */
00166 };
00167 #ifdef __STDC__
00168 static const double V0[5] = {
00169 #else
00170 static double V0[5] = {
00171 #endif
00172   1.99167318236649903973e-02, /* 0x3F94650D, 0x3F4DA9F0 */
00173   2.02552581025135171496e-04, /* 0x3F2A8C89, 0x6C257764 */
00174   1.35608801097516229404e-06, /* 0x3EB6C05A, 0x894E8CA6 */
00175   6.22741452364621501295e-09, /* 0x3E3ABF1D, 0x5BA69A86 */
00176   1.66559246207992079114e-11, /* 0x3DB25039, 0xDACA772A */
00177 };
00178 
00179 #ifdef __STDC__
00180     double __ieee754_y1(double x)
00181 #else
00182     double __ieee754_y1(x)
00183     double x;
00184 #endif
00185 {
00186     double z, s,c,ss,cc,u,v,u1,u2,v1,v2,v3,z2,z4;
00187     int32_t hx,ix,lx;
00188 
00189     EXTRACT_WORDS(hx,lx,x);
00190         ix = 0x7fffffff&hx;
00191     /* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
00192     if(ix>=0x7ff00000) return  one/(x+x*x);
00193         if((ix|lx)==0) return -HUGE_VAL+x; /* -inf and overflow exception.  */;
00194         if(hx<0) return zero/(zero*x);
00195         if(ix >= 0x40000000) {  /* |x| >= 2.0 */
00196         __sincos (x, &s, &c);
00197                 ss = -s-c;
00198                 cc = s-c;
00199                 if(ix<0x7fe00000) {  /* make sure x+x not overflow */
00200                     z = __cos(x+x);
00201                     if ((s*c)>zero) cc = z/ss;
00202                     else            ss = z/cc;
00203                 }
00204         /* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0))
00205          * where x0 = x-3pi/4
00206          *      Better formula:
00207          *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
00208          *                      =  1/sqrt(2) * (sin(x) - cos(x))
00209          *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
00210          *                      = -1/sqrt(2) * (cos(x) + sin(x))
00211          * To avoid cancellation, use
00212          *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
00213          * to compute the worse one.
00214          */
00215                 if(ix>0x48000000) z = (invsqrtpi*ss)/__ieee754_sqrt(x);
00216                 else {
00217                     u = pone(x); v = qone(x);
00218                     z = invsqrtpi*(u*ss+v*cc)/__ieee754_sqrt(x);
00219                 }
00220                 return z;
00221         }
00222         if(ix<=0x3c900000) {    /* x < 2**-54 */
00223             return(-tpi/x);
00224         }
00225         z = x*x;
00226 #ifdef DO_NOT_USE_THIS
00227         u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4])));
00228         v = one+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4]))));
00229 #else
00230     u1 = U0[0]+z*U0[1];z2=z*z;
00231     u2 = U0[2]+z*U0[3];z4=z2*z2;
00232     u  = u1 + z2*u2 + z4*U0[4];
00233     v1 = one+z*V0[0];
00234     v2 = V0[1]+z*V0[2];
00235     v3 = V0[3]+z*V0[4];
00236     v = v1 + z2*v2 + z4*v3;
00237 #endif
00238         return(x*(u/v) + tpi*(__ieee754_j1(x)*__ieee754_log(x)-one/x));
00239 }
00240 
00241 /* For x >= 8, the asymptotic expansions of pone is
00242  *  1 + 15/128 s^2 - 4725/2^15 s^4 - ...,   where s = 1/x.
00243  * We approximate pone by
00244  *  pone(x) = 1 + (R/S)
00245  * where  R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
00246  *    S = 1 + ps0*s^2 + ... + ps4*s^10
00247  * and
00248  *  | pone(x)-1-R/S | <= 2  ** ( -60.06)
00249  */
00250 
00251 #ifdef __STDC__
00252 static const double pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
00253 #else
00254 static double pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
00255 #endif
00256   0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
00257   1.17187499999988647970e-01, /* 0x3FBDFFFF, 0xFFFFFCCE */
00258   1.32394806593073575129e+01, /* 0x402A7A9D, 0x357F7FCE */
00259   4.12051854307378562225e+02, /* 0x4079C0D4, 0x652EA590 */
00260   3.87474538913960532227e+03, /* 0x40AE457D, 0xA3A532CC */
00261   7.91447954031891731574e+03, /* 0x40BEEA7A, 0xC32782DD */
00262 };
00263 #ifdef __STDC__
00264 static const double ps8[5] = {
00265 #else
00266 static double ps8[5] = {
00267 #endif
00268   1.14207370375678408436e+02, /* 0x405C8D45, 0x8E656CAC */
00269   3.65093083420853463394e+03, /* 0x40AC85DC, 0x964D274F */
00270   3.69562060269033463555e+04, /* 0x40E20B86, 0x97C5BB7F */
00271   9.76027935934950801311e+04, /* 0x40F7D42C, 0xB28F17BB */
00272   3.08042720627888811578e+04, /* 0x40DE1511, 0x697A0B2D */
00273 };
00274 
00275 #ifdef __STDC__
00276 static const double pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
00277 #else
00278 static double pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
00279 #endif
00280   1.31990519556243522749e-11, /* 0x3DAD0667, 0xDAE1CA7D */
00281   1.17187493190614097638e-01, /* 0x3FBDFFFF, 0xE2C10043 */
00282   6.80275127868432871736e+00, /* 0x401B3604, 0x6E6315E3 */
00283   1.08308182990189109773e+02, /* 0x405B13B9, 0x452602ED */
00284   5.17636139533199752805e+02, /* 0x40802D16, 0xD052D649 */
00285   5.28715201363337541807e+02, /* 0x408085B8, 0xBB7E0CB7 */
00286 };
00287 #ifdef __STDC__
00288 static const double ps5[5] = {
00289 #else
00290 static double ps5[5] = {
00291 #endif
00292   5.92805987221131331921e+01, /* 0x404DA3EA, 0xA8AF633D */
00293   9.91401418733614377743e+02, /* 0x408EFB36, 0x1B066701 */
00294   5.35326695291487976647e+03, /* 0x40B4E944, 0x5706B6FB */
00295   7.84469031749551231769e+03, /* 0x40BEA4B0, 0xB8A5BB15 */
00296   1.50404688810361062679e+03, /* 0x40978030, 0x036F5E51 */
00297 };
00298 
00299 #ifdef __STDC__
00300 static const double pr3[6] = {
00301 #else
00302 static double pr3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
00303 #endif
00304   3.02503916137373618024e-09, /* 0x3E29FC21, 0xA7AD9EDD */
00305   1.17186865567253592491e-01, /* 0x3FBDFFF5, 0x5B21D17B */
00306   3.93297750033315640650e+00, /* 0x400F76BC, 0xE85EAD8A */
00307   3.51194035591636932736e+01, /* 0x40418F48, 0x9DA6D129 */
00308   9.10550110750781271918e+01, /* 0x4056C385, 0x4D2C1837 */
00309   4.85590685197364919645e+01, /* 0x4048478F, 0x8EA83EE5 */
00310 };
00311 #ifdef __STDC__
00312 static const double ps3[5] = {
00313 #else
00314 static double ps3[5] = {
00315 #endif
00316   3.47913095001251519989e+01, /* 0x40416549, 0xA134069C */
00317   3.36762458747825746741e+02, /* 0x40750C33, 0x07F1A75F */
00318   1.04687139975775130551e+03, /* 0x40905B7C, 0x5037D523 */
00319   8.90811346398256432622e+02, /* 0x408BD67D, 0xA32E31E9 */
00320   1.03787932439639277504e+02, /* 0x4059F26D, 0x7C2EED53 */
00321 };
00322 
00323 #ifdef __STDC__
00324 static const double pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
00325 #else
00326 static double pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
00327 #endif
00328   1.07710830106873743082e-07, /* 0x3E7CE9D4, 0xF65544F4 */
00329   1.17176219462683348094e-01, /* 0x3FBDFF42, 0xBE760D83 */
00330   2.36851496667608785174e+00, /* 0x4002F2B7, 0xF98FAEC0 */
00331   1.22426109148261232917e+01, /* 0x40287C37, 0x7F71A964 */
00332   1.76939711271687727390e+01, /* 0x4031B1A8, 0x177F8EE2 */
00333   5.07352312588818499250e+00, /* 0x40144B49, 0xA574C1FE */
00334 };
00335 #ifdef __STDC__
00336 static const double ps2[5] = {
00337 #else
00338 static double ps2[5] = {
00339 #endif
00340   2.14364859363821409488e+01, /* 0x40356FBD, 0x8AD5ECDC */
00341   1.25290227168402751090e+02, /* 0x405F5293, 0x14F92CD5 */
00342   2.32276469057162813669e+02, /* 0x406D08D8, 0xD5A2DBD9 */
00343   1.17679373287147100768e+02, /* 0x405D6B7A, 0xDA1884A9 */
00344   8.36463893371618283368e+00, /* 0x4020BAB1, 0xF44E5192 */
00345 };
00346 
00347 #ifdef __STDC__
00348     static double pone(double x)
00349 #else
00350     static double pone(x)
00351     double x;
00352 #endif
00353 {
00354 #ifdef __STDC__
00355     const double *p = 0,*q = 0;
00356 #else
00357     double *p = 0,*q = 0;
00358 #endif
00359     double z,r,s,r1,r2,r3,s1,s2,s3,z2,z4;
00360         int32_t ix;
00361     GET_HIGH_WORD(ix,x);
00362     ix &= 0x7fffffff;
00363         if(ix>=0x40200000)     {p = pr8; q= ps8;}
00364         else if(ix>=0x40122E8B){p = pr5; q= ps5;}
00365         else if(ix>=0x4006DB6D){p = pr3; q= ps3;}
00366         else if(ix>=0x40000000){p = pr2; q= ps2;}
00367         z = one/(x*x);
00368 #ifdef DO_NOT_USE_THIS
00369         r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
00370         s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
00371 #else
00372     r1 = p[0]+z*p[1]; z2=z*z;
00373     r2 = p[2]+z*p[3]; z4=z2*z2;
00374     r3 = p[4]+z*p[5];
00375     r = r1 + z2*r2 + z4*r3;
00376     s1 = one+z*q[0];
00377     s2 = q[1]+z*q[2];
00378     s3 = q[3]+z*q[4];
00379     s = s1 + z2*s2 + z4*s3;
00380 #endif
00381         return one+ r/s;
00382 }
00383 
00384 
00385 /* For x >= 8, the asymptotic expansions of qone is
00386  *  3/8 s - 105/1024 s^3 - ..., where s = 1/x.
00387  * We approximate pone by
00388  *  qone(x) = s*(0.375 + (R/S))
00389  * where  R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10
00390  *    S = 1 + qs1*s^2 + ... + qs6*s^12
00391  * and
00392  *  | qone(x)/s -0.375-R/S | <= 2  ** ( -61.13)
00393  */
00394 
00395 #ifdef __STDC__
00396 static const double qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
00397 #else
00398 static double qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
00399 #endif
00400   0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
00401  -1.02539062499992714161e-01, /* 0xBFBA3FFF, 0xFFFFFDF3 */
00402  -1.62717534544589987888e+01, /* 0xC0304591, 0xA26779F7 */
00403  -7.59601722513950107896e+02, /* 0xC087BCD0, 0x53E4B576 */
00404  -1.18498066702429587167e+04, /* 0xC0C724E7, 0x40F87415 */
00405  -4.84385124285750353010e+04, /* 0xC0E7A6D0, 0x65D09C6A */
00406 };
00407 #ifdef __STDC__
00408 static const double qs8[6] = {
00409 #else
00410 static double qs8[6] = {
00411 #endif
00412   1.61395369700722909556e+02, /* 0x40642CA6, 0xDE5BCDE5 */
00413   7.82538599923348465381e+03, /* 0x40BE9162, 0xD0D88419 */
00414   1.33875336287249578163e+05, /* 0x4100579A, 0xB0B75E98 */
00415   7.19657723683240939863e+05, /* 0x4125F653, 0x72869C19 */
00416   6.66601232617776375264e+05, /* 0x412457D2, 0x7719AD5C */
00417  -2.94490264303834643215e+05, /* 0xC111F969, 0x0EA5AA18 */
00418 };
00419 
00420 #ifdef __STDC__
00421 static const double qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
00422 #else
00423 static double qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
00424 #endif
00425  -2.08979931141764104297e-11, /* 0xBDB6FA43, 0x1AA1A098 */
00426  -1.02539050241375426231e-01, /* 0xBFBA3FFF, 0xCB597FEF */
00427  -8.05644828123936029840e+00, /* 0xC0201CE6, 0xCA03AD4B */
00428  -1.83669607474888380239e+02, /* 0xC066F56D, 0x6CA7B9B0 */
00429  -1.37319376065508163265e+03, /* 0xC09574C6, 0x6931734F */
00430  -2.61244440453215656817e+03, /* 0xC0A468E3, 0x88FDA79D */
00431 };
00432 #ifdef __STDC__
00433 static const double qs5[6] = {
00434 #else
00435 static double qs5[6] = {
00436 #endif
00437   8.12765501384335777857e+01, /* 0x405451B2, 0xFF5A11B2 */
00438   1.99179873460485964642e+03, /* 0x409F1F31, 0xE77BF839 */
00439   1.74684851924908907677e+04, /* 0x40D10F1F, 0x0D64CE29 */
00440   4.98514270910352279316e+04, /* 0x40E8576D, 0xAABAD197 */
00441   2.79480751638918118260e+04, /* 0x40DB4B04, 0xCF7C364B */
00442  -4.71918354795128470869e+03, /* 0xC0B26F2E, 0xFCFFA004 */
00443 };
00444 
00445 #ifdef __STDC__
00446 static const double qr3[6] = {
00447 #else
00448 static double qr3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
00449 #endif
00450  -5.07831226461766561369e-09, /* 0xBE35CFA9, 0xD38FC84F */
00451  -1.02537829820837089745e-01, /* 0xBFBA3FEB, 0x51AEED54 */
00452  -4.61011581139473403113e+00, /* 0xC01270C2, 0x3302D9FF */
00453  -5.78472216562783643212e+01, /* 0xC04CEC71, 0xC25D16DA */
00454  -2.28244540737631695038e+02, /* 0xC06C87D3, 0x4718D55F */
00455  -2.19210128478909325622e+02, /* 0xC06B66B9, 0x5F5C1BF6 */
00456 };
00457 #ifdef __STDC__
00458 static const double qs3[6] = {
00459 #else
00460 static double qs3[6] = {
00461 #endif
00462   4.76651550323729509273e+01, /* 0x4047D523, 0xCCD367E4 */
00463   6.73865112676699709482e+02, /* 0x40850EEB, 0xC031EE3E */
00464   3.38015286679526343505e+03, /* 0x40AA684E, 0x448E7C9A */
00465   5.54772909720722782367e+03, /* 0x40B5ABBA, 0xA61D54A6 */
00466   1.90311919338810798763e+03, /* 0x409DBC7A, 0x0DD4DF4B */
00467  -1.35201191444307340817e+02, /* 0xC060E670, 0x290A311F */
00468 };
00469 
00470 #ifdef __STDC__
00471 static const double qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
00472 #else
00473 static double qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
00474 #endif
00475  -1.78381727510958865572e-07, /* 0xBE87F126, 0x44C626D2 */
00476  -1.02517042607985553460e-01, /* 0xBFBA3E8E, 0x9148B010 */
00477  -2.75220568278187460720e+00, /* 0xC0060484, 0x69BB4EDA */
00478  -1.96636162643703720221e+01, /* 0xC033A9E2, 0xC168907F */
00479  -4.23253133372830490089e+01, /* 0xC04529A3, 0xDE104AAA */
00480  -2.13719211703704061733e+01, /* 0xC0355F36, 0x39CF6E52 */
00481 };
00482 #ifdef __STDC__
00483 static const double qs2[6] = {
00484 #else
00485 static double qs2[6] = {
00486 #endif
00487   2.95333629060523854548e+01, /* 0x403D888A, 0x78AE64FF */
00488   2.52981549982190529136e+02, /* 0x406F9F68, 0xDB821CBA */
00489   7.57502834868645436472e+02, /* 0x4087AC05, 0xCE49A0F7 */
00490   7.39393205320467245656e+02, /* 0x40871B25, 0x48D4C029 */
00491   1.55949003336666123687e+02, /* 0x40637E5E, 0x3C3ED8D4 */
00492  -4.95949898822628210127e+00, /* 0xC013D686, 0xE71BE86B */
00493 };
00494 
00495 #ifdef __STDC__
00496     static double qone(double x)
00497 #else
00498     static double qone(x)
00499     double x;
00500 #endif
00501 {
00502 #ifdef __STDC__
00503     const double *p = 0,*q = 0;
00504 #else
00505     double *p = 0,*q = 0;
00506 #endif
00507     double  s,r,z,r1,r2,r3,s1,s2,s3,z2,z4,z6;
00508     int32_t ix;
00509     GET_HIGH_WORD(ix,x);
00510     ix &= 0x7fffffff;
00511     if(ix>=0x40200000)     {p = qr8; q= qs8;}
00512     else if(ix>=0x40122E8B){p = qr5; q= qs5;}
00513     else if(ix>=0x4006DB6D){p = qr3; q= qs3;}
00514     else if(ix>=0x40000000){p = qr2; q= qs2;}
00515     z = one/(x*x);
00516 #ifdef DO_NOT_USE_THIS
00517     r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
00518     s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
00519 #else
00520     r1 = p[0]+z*p[1]; z2=z*z;
00521     r2 = p[2]+z*p[3]; z4=z2*z2;
00522     r3 = p[4]+z*p[5]; z6=z4*z2;
00523     r = r1 + z2*r2 + z4*r3;
00524     s1 = one+z*q[0];
00525     s2 = q[1]+z*q[2];
00526     s3 = q[3]+z*q[4];
00527     s = s1 + z2*s2 + z4*s3 + z6*q[5];
00528 #endif
00529     return (.375 + r/s)/x;
00530 }

Generated on Fri May 25 2012 04:34:54 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.