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

j0_y0.c
Go to the documentation of this file.
00001 /* @(#)e_j0.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_j0.c,v 1.8 1995/05/10 20:45:23 jtc Exp $";
00018 #endif
00019 
00020 /* __ieee754_j0(x), __ieee754_y0(x)
00021  * Bessel function of the first and second kinds of order zero.
00022  * Method -- j0(x):
00023  *  1. For tiny x, we use j0(x) = 1 - x^2/4 + x^4/64 - ...
00024  *  2. Reduce x to |x| since j0(x)=j0(-x),  and
00025  *     for x in (0,2)
00026  *      j0(x) = 1-z/4+ z^2*R0/S0,  where z = x*x;
00027  *     (precision:  |j0-1+z/4-z^2R0/S0 |<2**-63.67 )
00028  *     for x in (2,inf)
00029  *      j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0))
00030  *     where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
00031  *     as follow:
00032  *      cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
00033  *          = 1/sqrt(2) * (cos(x) + sin(x))
00034  *      sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4)
00035  *          = 1/sqrt(2) * (sin(x) - cos(x))
00036  *     (To avoid cancellation, use
00037  *      sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
00038  *      to compute the worse one.)
00039  *
00040  *  3 Special cases
00041  *      j0(nan)= nan
00042  *      j0(0) = 1
00043  *      j0(inf) = 0
00044  *
00045  * Method -- y0(x):
00046  *  1. For x<2.
00047  *     Since
00048  *      y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...)
00049  *     therefore y0(x)-2/pi*j0(x)*ln(x) is an even function.
00050  *     We use the following function to approximate y0,
00051  *      y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2
00052  *     where
00053  *      U(z) = u00 + u01*z + ... + u06*z^6
00054  *      V(z) = 1  + v01*z + ... + v04*z^4
00055  *     with absolute approximation error bounded by 2**-72.
00056  *     Note: For tiny x, U/V = u0 and j0(x)~1, hence
00057  *      y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27)
00058  *  2. For x>=2.
00059  *      y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0))
00060  *     where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
00061  *     by the method mentioned above.
00062  *  3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0.
00063  */
00064 
00065 #include "math.h"
00066 #include "ieee754.h"
00067 
00068 #ifdef __STDC__
00069 static double pzero(double), qzero(double);
00070 #else
00071 static double pzero(), qzero();
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.00] */
00084 R[]  =  {0.0, 0.0, 1.56249999999999947958e-02, /* 0x3F8FFFFF, 0xFFFFFFFD */
00085  -1.89979294238854721751e-04, /* 0xBF28E6A5, 0xB61AC6E9 */
00086   1.82954049532700665670e-06, /* 0x3EBEB1D1, 0x0C503919 */
00087  -4.61832688532103189199e-09}, /* 0xBE33D5E7, 0x73D63FCE */
00088 S[]  =  {0.0, 1.56191029464890010492e-02, /* 0x3F8FFCE8, 0x82C8C2A4 */
00089   1.16926784663337450260e-04, /* 0x3F1EA6D2, 0xDD57DBF4 */
00090   5.13546550207318111446e-07, /* 0x3EA13B54, 0xCE84D5A9 */
00091   1.16614003333790000205e-09}; /* 0x3E1408BC, 0xF4745D8F */
00092 
00093 #ifdef __STDC__
00094 static const double zero = 0.0;
00095 #else
00096 static double zero = 0.0;
00097 #endif
00098 
00099 #ifdef __STDC__
00100     double __ieee754_j0(double x)
00101 #else
00102     double __ieee754_j0(x)
00103     double x;
00104 #endif
00105 {
00106     double z, s,c,ss,cc,r,u,v,r1,r2,s1,s2,z2,z4;
00107     int32_t hx,ix;
00108 
00109     GET_HIGH_WORD(hx,x);
00110     ix = hx&0x7fffffff;
00111     if(ix>=0x7ff00000) return one/(x*x);
00112     x = fabs(x);
00113     if(ix >= 0x40000000) {  /* |x| >= 2.0 */
00114         __sincos (x, &s, &c);
00115         ss = s-c;
00116         cc = s+c;
00117         if(ix<0x7fe00000) {  /* make sure x+x not overflow */
00118             z = -__cos(x+x);
00119             if ((s*c)<zero) cc = z/ss;
00120             else        ss = z/cc;
00121         }
00122     /*
00123      * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
00124      * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
00125      */
00126         if(ix>0x48000000) z = (invsqrtpi*cc)/__ieee754_sqrt(x);
00127         else {
00128             u = pzero(x); v = qzero(x);
00129             z = invsqrtpi*(u*cc-v*ss)/__ieee754_sqrt(x);
00130         }
00131         return z;
00132     }
00133     if(ix<0x3f200000) { /* |x| < 2**-13 */
00134         if(huge+x>one) {    /* raise inexact if x != 0 */
00135             if(ix<0x3e400000) return one;   /* |x|<2**-27 */
00136             else          return one - 0.25*x*x;
00137         }
00138     }
00139     z = x*x;
00140 #ifdef DO_NOT_USE_THIS
00141     r =  z*(R02+z*(R03+z*(R04+z*R05)));
00142     s =  one+z*(S01+z*(S02+z*(S03+z*S04)));
00143 #else
00144     r1 = z*R[2]; z2=z*z;
00145     r2 = R[3]+z*R[4]; z4=z2*z2;
00146     r  = r1 + z2*r2 + z4*R[5];
00147     s1 = one+z*S[1];
00148     s2 = S[2]+z*S[3];
00149     s = s1 + z2*s2 + z4*S[4];
00150 #endif
00151     if(ix < 0x3FF00000) {   /* |x| < 1.00 */
00152         return one + z*(-0.25+(r/s));
00153     } else {
00154         u = 0.5*x;
00155         return((one+u)*(one-u)+z*(r/s));
00156     }
00157 }
00158 
00159 #ifdef __STDC__
00160 static const double
00161 #else
00162 static double
00163 #endif
00164 U[]  = {-7.38042951086872317523e-02, /* 0xBFB2E4D6, 0x99CBD01F */
00165   1.76666452509181115538e-01, /* 0x3FC69D01, 0x9DE9E3FC */
00166  -1.38185671945596898896e-02, /* 0xBF8C4CE8, 0xB16CFA97 */
00167   3.47453432093683650238e-04, /* 0x3F36C54D, 0x20B29B6B */
00168  -3.81407053724364161125e-06, /* 0xBECFFEA7, 0x73D25CAD */
00169   1.95590137035022920206e-08, /* 0x3E550057, 0x3B4EABD4 */
00170  -3.98205194132103398453e-11}, /* 0xBDC5E43D, 0x693FB3C8 */
00171 V[]  =  {1.27304834834123699328e-02, /* 0x3F8A1270, 0x91C9C71A */
00172   7.60068627350353253702e-05, /* 0x3F13ECBB, 0xF578C6C1 */
00173   2.59150851840457805467e-07, /* 0x3E91642D, 0x7FF202FD */
00174   4.41110311332675467403e-10}; /* 0x3DFE5018, 0x3BD6D9EF */
00175 
00176 #ifdef __STDC__
00177     double __ieee754_y0(double x)
00178 #else
00179     double __ieee754_y0(x)
00180     double x;
00181 #endif
00182 {
00183     double z, s,c,ss,cc,u,v,z2,z4,z6,u1,u2,u3,v1,v2;
00184     int32_t hx,ix,lx;
00185 
00186     EXTRACT_WORDS(hx,lx,x);
00187         ix = 0x7fffffff&hx;
00188     /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0, y0(0) is -inf.  */
00189     if(ix>=0x7ff00000) return  one/(x+x*x);
00190         if((ix|lx)==0) return -HUGE_VAL+x; /* -inf and overflow exception.  */
00191         if(hx<0) return zero/(zero*x);
00192         if(ix >= 0x40000000) {  /* |x| >= 2.0 */
00193         /* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
00194          * where x0 = x-pi/4
00195          *      Better formula:
00196          *              cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
00197          *                      =  1/sqrt(2) * (sin(x) + cos(x))
00198          *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
00199          *                      =  1/sqrt(2) * (sin(x) - cos(x))
00200          * To avoid cancellation, use
00201          *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
00202          * to compute the worse one.
00203          */
00204         __sincos (x, &s, &c);
00205                 ss = s-c;
00206                 cc = s+c;
00207     /*
00208      * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
00209      * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
00210      */
00211                 if(ix<0x7fe00000) {  /* make sure x+x not overflow */
00212                     z = -__cos(x+x);
00213                     if ((s*c)<zero) cc = z/ss;
00214                     else            ss = z/cc;
00215                 }
00216                 if(ix>0x48000000) z = (invsqrtpi*ss)/__ieee754_sqrt(x);
00217                 else {
00218                     u = pzero(x); v = qzero(x);
00219                     z = invsqrtpi*(u*ss+v*cc)/__ieee754_sqrt(x);
00220                 }
00221                 return z;
00222     }
00223     if(ix<=0x3e400000) {    /* x < 2**-27 */
00224         return(U[0] + tpi*__ieee754_log(x));
00225     }
00226     z = x*x;
00227 #ifdef DO_NOT_USE_THIS
00228     u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06)))));
00229     v = one+z*(v01+z*(v02+z*(v03+z*v04)));
00230 #else
00231     u1 = U[0]+z*U[1]; z2=z*z;
00232     u2 = U[2]+z*U[3]; z4=z2*z2;
00233     u3 = U[4]+z*U[5]; z6=z4*z2;
00234     u = u1 + z2*u2 + z4*u3 + z6*U[6];
00235     v1 = one+z*V[0];
00236     v2 = V[1]+z*V[2];
00237     v = v1 + z2*v2 + z4*V[3];
00238 #endif
00239     return(u/v + tpi*(__ieee754_j0(x)*__ieee754_log(x)));
00240 }
00241 
00242 /* The asymptotic expansions of pzero is
00243  *  1 - 9/128 s^2 + 11025/98304 s^4 - ...,  where s = 1/x.
00244  * For x >= 2, We approximate pzero by
00245  *  pzero(x) = 1 + (R/S)
00246  * where  R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10
00247  *    S = 1 + pS0*s^2 + ... + pS4*s^10
00248  * and
00249  *  | pzero(x)-1-R/S | <= 2  ** ( -60.26)
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  -7.03124999999900357484e-02, /* 0xBFB1FFFF, 0xFFFFFD32 */
00258  -8.08167041275349795626e+00, /* 0xC02029D0, 0xB44FA779 */
00259  -2.57063105679704847262e+02, /* 0xC0701102, 0x7B19E863 */
00260  -2.48521641009428822144e+03, /* 0xC0A36A6E, 0xCD4DCAFC */
00261  -5.25304380490729545272e+03, /* 0xC0B4850B, 0x36CC643D */
00262 };
00263 #ifdef __STDC__
00264 static const double pS8[5] = {
00265 #else
00266 static double pS8[5] = {
00267 #endif
00268   1.16534364619668181717e+02, /* 0x405D2233, 0x07A96751 */
00269   3.83374475364121826715e+03, /* 0x40ADF37D, 0x50596938 */
00270   4.05978572648472545552e+04, /* 0x40E3D2BB, 0x6EB6B05F */
00271   1.16752972564375915681e+05, /* 0x40FC810F, 0x8F9FA9BD */
00272   4.76277284146730962675e+04, /* 0x40E74177, 0x4F2C49DC */
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.14125464691894502584e-11, /* 0xBDA918B1, 0x47E495CC */
00281  -7.03124940873599280078e-02, /* 0xBFB1FFFF, 0xE69AFBC6 */
00282  -4.15961064470587782438e+00, /* 0xC010A370, 0xF90C6BBF */
00283  -6.76747652265167261021e+01, /* 0xC050EB2F, 0x5A7D1783 */
00284  -3.31231299649172967747e+02, /* 0xC074B3B3, 0x6742CC63 */
00285  -3.46433388365604912451e+02, /* 0xC075A6EF, 0x28A38BD7 */
00286 };
00287 #ifdef __STDC__
00288 static const double pS5[5] = {
00289 #else
00290 static double pS5[5] = {
00291 #endif
00292   6.07539382692300335975e+01, /* 0x404E6081, 0x0C98C5DE */
00293   1.05125230595704579173e+03, /* 0x40906D02, 0x5C7E2864 */
00294   5.97897094333855784498e+03, /* 0x40B75AF8, 0x8FBE1D60 */
00295   9.62544514357774460223e+03, /* 0x40C2CCB8, 0xFA76FA38 */
00296   2.40605815922939109441e+03, /* 0x40A2CC1D, 0xC70BE864 */
00297 };
00298 
00299 #ifdef __STDC__
00300 static const double pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
00301 #else
00302 static double pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
00303 #endif
00304  -2.54704601771951915620e-09, /* 0xBE25E103, 0x6FE1AA86 */
00305  -7.03119616381481654654e-02, /* 0xBFB1FFF6, 0xF7C0E24B */
00306  -2.40903221549529611423e+00, /* 0xC00345B2, 0xAEA48074 */
00307  -2.19659774734883086467e+01, /* 0xC035F74A, 0x4CB94E14 */
00308  -5.80791704701737572236e+01, /* 0xC04D0A22, 0x420A1A45 */
00309  -3.14479470594888503854e+01, /* 0xC03F72AC, 0xA892D80F */
00310 };
00311 #ifdef __STDC__
00312 static const double pS3[5] = {
00313 #else
00314 static double pS3[5] = {
00315 #endif
00316   3.58560338055209726349e+01, /* 0x4041ED92, 0x84077DD3 */
00317   3.61513983050303863820e+02, /* 0x40769839, 0x464A7C0E */
00318   1.19360783792111533330e+03, /* 0x4092A66E, 0x6D1061D6 */
00319   1.12799679856907414432e+03, /* 0x40919FFC, 0xB8C39B7E */
00320   1.73580930813335754692e+02, /* 0x4065B296, 0xFC379081 */
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  -8.87534333032526411254e-08, /* 0xBE77D316, 0xE927026D */
00329  -7.03030995483624743247e-02, /* 0xBFB1FF62, 0x495E1E42 */
00330  -1.45073846780952986357e+00, /* 0xBFF73639, 0x8A24A843 */
00331  -7.63569613823527770791e+00, /* 0xC01E8AF3, 0xEDAFA7F3 */
00332  -1.11931668860356747786e+01, /* 0xC02662E6, 0xC5246303 */
00333  -3.23364579351335335033e+00, /* 0xC009DE81, 0xAF8FE70F */
00334 };
00335 #ifdef __STDC__
00336 static const double pS2[5] = {
00337 #else
00338 static double pS2[5] = {
00339 #endif
00340   2.22202997532088808441e+01, /* 0x40363865, 0x908B5959 */
00341   1.36206794218215208048e+02, /* 0x4061069E, 0x0EE8878F */
00342   2.70470278658083486789e+02, /* 0x4070E786, 0x42EA079B */
00343   1.53875394208320329881e+02, /* 0x40633C03, 0x3AB6FAFF */
00344   1.46576176948256193810e+01, /* 0x402D50B3, 0x44391809 */
00345 };
00346 
00347 #ifdef __STDC__
00348     static double pzero(double x)
00349 #else
00350     static double pzero(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,z2,z4,r1,r2,r3,s1,s2,s3;
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 qzero is
00386  *  -1/8 s + 75/1024 s^3 - ..., where s = 1/x.
00387  * We approximate pzero by
00388  *  qzero(x) = s*(-1.25 + (R/S))
00389  * where  R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10
00390  *    S = 1 + qS0*s^2 + ... + qS5*s^12
00391  * and
00392  *  | qzero(x)/s +1.25-R/S | <= 2  ** ( -61.22)
00393  */
00394 #ifdef __STDC__
00395 static const double qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
00396 #else
00397 static double qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
00398 #endif
00399   0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
00400   7.32421874999935051953e-02, /* 0x3FB2BFFF, 0xFFFFFE2C */
00401   1.17682064682252693899e+01, /* 0x40278952, 0x5BB334D6 */
00402   5.57673380256401856059e+02, /* 0x40816D63, 0x15301825 */
00403   8.85919720756468632317e+03, /* 0x40C14D99, 0x3E18F46D */
00404   3.70146267776887834771e+04, /* 0x40E212D4, 0x0E901566 */
00405 };
00406 #ifdef __STDC__
00407 static const double qS8[6] = {
00408 #else
00409 static double qS8[6] = {
00410 #endif
00411   1.63776026895689824414e+02, /* 0x406478D5, 0x365B39BC */
00412   8.09834494656449805916e+03, /* 0x40BFA258, 0x4E6B0563 */
00413   1.42538291419120476348e+05, /* 0x41016652, 0x54D38C3F */
00414   8.03309257119514397345e+05, /* 0x412883DA, 0x83A52B43 */
00415   8.40501579819060512818e+05, /* 0x4129A66B, 0x28DE0B3D */
00416  -3.43899293537866615225e+05, /* 0xC114FD6D, 0x2C9530C5 */
00417 };
00418 
00419 #ifdef __STDC__
00420 static const double qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
00421 #else
00422 static double qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
00423 #endif
00424   1.84085963594515531381e-11, /* 0x3DB43D8F, 0x29CC8CD9 */
00425   7.32421766612684765896e-02, /* 0x3FB2BFFF, 0xD172B04C */
00426   5.83563508962056953777e+00, /* 0x401757B0, 0xB9953DD3 */
00427   1.35111577286449829671e+02, /* 0x4060E392, 0x0A8788E9 */
00428   1.02724376596164097464e+03, /* 0x40900CF9, 0x9DC8C481 */
00429   1.98997785864605384631e+03, /* 0x409F17E9, 0x53C6E3A6 */
00430 };
00431 #ifdef __STDC__
00432 static const double qS5[6] = {
00433 #else
00434 static double qS5[6] = {
00435 #endif
00436   8.27766102236537761883e+01, /* 0x4054B1B3, 0xFB5E1543 */
00437   2.07781416421392987104e+03, /* 0x40A03BA0, 0xDA21C0CE */
00438   1.88472887785718085070e+04, /* 0x40D267D2, 0x7B591E6D */
00439   5.67511122894947329769e+04, /* 0x40EBB5E3, 0x97E02372 */
00440   3.59767538425114471465e+04, /* 0x40E19118, 0x1F7A54A0 */
00441  -5.35434275601944773371e+03, /* 0xC0B4EA57, 0xBEDBC609 */
00442 };
00443 
00444 #ifdef __STDC__
00445 static const double qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
00446 #else
00447 static double qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
00448 #endif
00449   4.37741014089738620906e-09, /* 0x3E32CD03, 0x6ADECB82 */
00450   7.32411180042911447163e-02, /* 0x3FB2BFEE, 0x0E8D0842 */
00451   3.34423137516170720929e+00, /* 0x400AC0FC, 0x61149CF5 */
00452   4.26218440745412650017e+01, /* 0x40454F98, 0x962DAEDD */
00453   1.70808091340565596283e+02, /* 0x406559DB, 0xE25EFD1F */
00454   1.66733948696651168575e+02, /* 0x4064D77C, 0x81FA21E0 */
00455 };
00456 #ifdef __STDC__
00457 static const double qS3[6] = {
00458 #else
00459 static double qS3[6] = {
00460 #endif
00461   4.87588729724587182091e+01, /* 0x40486122, 0xBFE343A6 */
00462   7.09689221056606015736e+02, /* 0x40862D83, 0x86544EB3 */
00463   3.70414822620111362994e+03, /* 0x40ACF04B, 0xE44DFC63 */
00464   6.46042516752568917582e+03, /* 0x40B93C6C, 0xD7C76A28 */
00465   2.51633368920368957333e+03, /* 0x40A3A8AA, 0xD94FB1C0 */
00466  -1.49247451836156386662e+02, /* 0xC062A7EB, 0x201CF40F */
00467 };
00468 
00469 #ifdef __STDC__
00470 static const double qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
00471 #else
00472 static double qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
00473 #endif
00474   1.50444444886983272379e-07, /* 0x3E84313B, 0x54F76BDB */
00475   7.32234265963079278272e-02, /* 0x3FB2BEC5, 0x3E883E34 */
00476   1.99819174093815998816e+00, /* 0x3FFFF897, 0xE727779C */
00477   1.44956029347885735348e+01, /* 0x402CFDBF, 0xAAF96FE5 */
00478   3.16662317504781540833e+01, /* 0x403FAA8E, 0x29FBDC4A */
00479   1.62527075710929267416e+01, /* 0x403040B1, 0x71814BB4 */
00480 };
00481 #ifdef __STDC__
00482 static const double qS2[6] = {
00483 #else
00484 static double qS2[6] = {
00485 #endif
00486   3.03655848355219184498e+01, /* 0x403E5D96, 0xF7C07AED */
00487   2.69348118608049844624e+02, /* 0x4070D591, 0xE4D14B40 */
00488   8.44783757595320139444e+02, /* 0x408A6645, 0x22B3BF22 */
00489   8.82935845112488550512e+02, /* 0x408B977C, 0x9C5CC214 */
00490   2.12666388511798828631e+02, /* 0x406A9553, 0x0E001365 */
00491  -5.31095493882666946917e+00, /* 0xC0153E6A, 0xF8B32931 */
00492 };
00493 
00494 #ifdef __STDC__
00495     static double qzero(double x)
00496 #else
00497     static double qzero(x)
00498     double x;
00499 #endif
00500 {
00501 #ifdef __STDC__
00502     const double *p = 0,*q = 0;
00503 #else
00504     double *p = 0,*q = 0;
00505 #endif
00506     double s,r,z,z2,z4,z6,r1,r2,r3,s1,s2,s3;
00507     int32_t ix;
00508     GET_HIGH_WORD(ix,x);
00509     ix &= 0x7fffffff;
00510     if(ix>=0x40200000)     {p = qR8; q= qS8;}
00511     else if(ix>=0x40122E8B){p = qR5; q= qS5;}
00512     else if(ix>=0x4006DB6D){p = qR3; q= qS3;}
00513     else if(ix>=0x40000000){p = qR2; q= qS2;}
00514     z = one/(x*x);
00515 #ifdef DO_NOT_USE_THIS
00516     r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
00517     s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
00518 #else
00519     r1 = p[0]+z*p[1]; z2=z*z;
00520     r2 = p[2]+z*p[3]; z4=z2*z2;
00521     r3 = p[4]+z*p[5]; z6=z4*z2;
00522     r= r1 + z2*r2 + z4*r3;
00523     s1 = one+z*q[0];
00524     s2 = q[1]+z*q[2];
00525     s3 = q[3]+z*q[4];
00526     s = s1 + z2*s2 + z4*s3 +z6*q[5];
00527 #endif
00528     return (-.125 + r/s)/x;
00529 }

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.