Print this page
11210 libm should be cstyle(1ONBLD) clean


   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  24  */

  25 /*
  26  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  27  * Use is subject to license terms.
  28  */
  29 
  30 /*
  31  * floating point Bessel's function of the first and second kinds
  32  * of order zero: j1(x),y1(x);
  33  *
  34  * Special cases:
  35  *      y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
  36  *      y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
  37  */
  38 
  39 #pragma weak __j1l = j1l
  40 #pragma weak __y1l = y1l
  41 
  42 #include "libm.h"
  43 #include "longdouble.h"
  44 #include <math.h>
  45 #if defined(__SUNPRO_C)
  46 #include <sunmath.h>
  47 #endif
  48 
  49 #define GENERIC long double
  50 static GENERIC
  51 zero    = 0.0L,
  52 small   = 1.0e-9L,
  53 tiny    = 1.0e-38L,
  54 one     = 1.0L,
  55 five    = 5.0L,
  56 invsqrtpi = 5.641895835477562869480794515607725858441e-0001L,
  57 tpi     = 0.636619772367581343075535053490057448L;
  58 
  59 static GENERIC pone(), qone();

  60 static GENERIC r0[7] = {
  61   -6.249999999999999999999999999999999627320e-0002L,
  62    1.940606727194041716205384618494641565464e-0003L,
  63   -3.005630423155733701856481469986459043883e-0005L,
  64    2.345586219403918667468341047369572169358e-0007L,
  65   -9.976809285885253587529010109133336669724e-0010L,
  66    2.218743258363623946078958783775107473381e-0012L,
  67   -2.071079656218700604767650924103578046280e-0015L,
  68 };

  69 static GENERIC s0[7] = {
  70    1.0e0L,
  71    1.061695903156199920738051277075003059555e-0002L,
  72    5.521860513111180371566951179398862692060e-0005L,
  73    1.824214367413754193524107877084979441407e-0007L,
  74    4.098957778439576834818838198039029353925e-0010L,
  75    6.047735079699666389853240090925264056197e-0013L,
  76    4.679044728878836197247923279512047035041e-0016L,
  77 };
  78 
  79 GENERIC
  80 j1l(x) GENERIC x; {

  81         GENERIC z, d, s, c, ss, cc, r;
  82         int i, sgn;
  83 
  84         if (!finitel(x))
  85                 return (one/x);

  86         sgn = signbitl(x);
  87         x = fabsl(x);

  88         if (x > 1.28L) {
  89                 s = sinl(x);
  90                 c = cosl(x);


  91         /*
  92          * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x0)-q1(x)*sin(x0))
  93          * where x0 = x-3pi/4
  94          *      Better formula:
  95          *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
  96          *                      =  1/sqrt(2) * (sin(x) - cos(x))
  97          *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
  98          *                      = -1/sqrt(2) * (cos(x) + sin(x))
  99          * To avoid cancellation, use
 100          *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
 101          * to compute the worse one.
 102          */

 103                 if (x > 1.0e2450L) { /* x+x may overflow */
 104                         ss = -s-c;
 105                         cc =  s-c;
 106                 } else if (signbitl(s) != signbitl(c)) {
 107                         cc = s - c;
 108                         ss = cosl(x+x)/cc;
 109                 } else {
 110                         ss = -s-c;
 111                         cc = cosl(x+x)/ss;
 112                 }

 113         /*
 114          * j1(x) = 1/sqrt(pi*x) * (P(1,x)*cc - Q(1,x)*ss)
 115          * y1(x) = 1/sqrt(pi*x) * (P(1,x)*ss + Q(1,x)*cc)
 116          */
 117                 if (x > 1.0e120L)
 118                                         return (invsqrtpi*cc)/sqrtl(x);
 119                 d =  invsqrtpi*(pone(x)*cc-qone(x)*ss)/sqrtl(x);


 120                 if (sgn == 0)
 121                         return (d);
 122                 else
 123                         return (-d);
 124         }

 125         if (x <= small) {
 126             if (x <= tiny) d = 0.5L*x;
 127             else d =  x*(0.5L-x*x*0.125L);



 128             if (sgn == 0)
 129                         return (d);
 130                 else
 131                         return (-d);
 132         }
 133         z = x*x;

 134             r = r0[6];
 135             s = s0[6];

 136             for (i = 5; i >= 0; i--) {
 137                 r = r*z + r0[i];
 138                 s = s*z + s0[i];
 139             }
 140         d = x*0.5L+x*(z*(r/s));


 141         if (sgn == 0)
 142                 return (d);
 143         else
 144                 return (-d);
 145 }
 146 
 147 static GENERIC u0[7] = {
 148   -1.960570906462389484060557273467558703503e-0001L,
 149    5.166389353148318460304315890665450006495e-0002L,
 150   -2.229699464105910913337190798743451115604e-0003L,
 151    3.625437034548863342715657067759078267158e-0005L,
 152   -2.689902826993117212255524537353883987171e-0007L,
 153    9.304570592456930912969387719010256018466e-0010L,
 154   -1.234878126794286643318321347997500346131e-0012L,
 155 };

 156 static GENERIC v0[8] = {
 157    1.0e0L,
 158    1.369394302535807332517110204820556695644e-0002L,
 159    9.508438148097659501433367062605935379588e-0005L,
 160    4.399007309420092056052714797296467565655e-0007L,
 161    1.488083087443756398305819693177715000787e-0009L,
 162    3.751609832625793536245746965768587624922e-0012L,
 163    6.680926434086257291872903276124244131448e-0015L,
 164    6.676602383908906988160099057991121446058e-0018L,
 165 };
 166 
 167 GENERIC
 168 y1l(x) GENERIC x; {

 169         GENERIC z, s, c, ss, cc, u, v;
 170         int i;
 171 
 172         if (isnanl(x))
 173                 return (x+x);

 174         if (x <= zero) {
 175                 if (x == zero)
 176                     return (-one/zero);
 177                 else
 178                     return (zero/zero);
 179         }

 180         if (x > 1.28L) {
 181                 if (!finitel(x))
 182                         return (zero);

 183                 s = sinl(x);
 184                 c = cosl(x);


 185         /*
 186          * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x0)-q1(x)*sin(x0))
 187          * where x0 = x-3pi/4
 188          *      Better formula:
 189          *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
 190          *                      =  1/sqrt(2) * (sin(x) - cos(x))
 191          *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
 192          *                      = -1/sqrt(2) * (cos(x) + sin(x))
 193          * To avoid cancellation, use
 194          *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
 195          * to compute the worse one.
 196          */

 197                 if (x > 1.0e2450L) { /* x+x may overflow */
 198                         ss = -s-c;
 199                         cc =  s-c;
 200                 } else if (signbitl(s) != signbitl(c)) {
 201                         cc = s - c;
 202                         ss = cosl(x+x)/cc;
 203                 } else {
 204                         ss = -s-c;
 205                         cc = cosl(x+x)/ss;
 206                 }

 207         /*
 208          * j1(x) = 1/sqrt(pi*x) * (P(1,x)*cc - Q(1,x)*ss)
 209          * y1(x) = 1/sqrt(pi*x) * (P(1,x)*ss + Q(1,x)*cc)
 210          */
 211                 if (x > 1.0e91L)
 212                         return (invsqrtpi*ss)/sqrtl(x);
 213         return (invsqrtpi*(pone(x)*ss+qone(x)*cc)/sqrtl(x));
 214         }
 215         if (x <= tiny) {
 216             return (-tpi/x);
 217         }
 218         z = x*x;
 219             u = u0[6]; v = v0[6]+z*v0[7];






 220             for (i = 5; i >= 0; i--) {
 221                 u = u*z + u0[i];
 222                 v = v*z + v0[i];
 223             }
 224         return (x*(u/v) + tpi*(j1l(x)*logl(x)-one/x));

 225 }
 226 
 227 static GENERIC pr0[12] = {
 228    1.000000000000000000000000000000000000267e+0000L,
 229    1.060717875045891455602180843276758003035e+0003L,
 230    4.344347542892127024446687712181105852335e+0005L,
 231    8.915680220724007016377924252717410457094e+0007L,
 232    9.969502259938406062809873257569171272819e+0009L,
 233    6.200290193138613035646510338707386316595e+0011L,
 234    2.105978548788015119851815854422247330118e+0013L,
 235    3.696635772784601239371730810311998368948e+0014L,
 236    3.015913097920694682057958412534134515156e+0015L,
 237    9.370298471339353098123277427328592725921e+0015L,
 238    7.190349005196335967340799265074029443057e+0015L,
 239    2.736097786240689996880391074927552517982e+0014L,
 240 };

 241 static GENERIC ps0[11] = {
 242    1.0e0L,
 243    1.060600687545891455602180843276758095107e+0003L,
 244    4.343106093416975589147153906505338900961e+0005L,
 245    8.910605869002176566582072242244353399059e+0007L,
 246    9.959122058635087888690713917622056540190e+0009L,
 247    6.188744967234948231792482949171041843894e+0011L,
 248    2.098863976953783506401759873801990304907e+0013L,
 249    3.672870357018063196746729751479938908450e+0014L,
 250    2.975538419246824921049011529574385888420e+0015L,
 251    9.063657659995043205018686029284479837091e+0015L,
 252    6.401953344314747916729366441508892711691e+0015L,
 253 };

 254 static GENERIC pr1[12] = {
 255    1.000000000000000000000023667524130660984e+0000L,
 256    6.746154419979618754354803488126452971204e+0002L,
 257    1.811210781083390154857018330296145970502e+0005L,
 258    2.533098390379924268038005329095287842244e+0007L,
 259    2.029683619805342145252338570875424600729e+0009L,
 260    9.660859662192711465301069401598929980319e+0010L,
 261    2.743396238644831519934098967716621316316e+0012L,
 262    4.553097354140854377931023170263455246288e+0013L,
 263    4.210245069852219757476169864974870720374e+0014L,
 264    1.987334056229596485076645967176169801727e+0015L,
 265    4.067120052787096893838970455751338930462e+0015L,
 266    2.486539606380406398310845264910691398133e+0015L,
 267 };

 268 static GENERIC ps1[14] = {
 269    1.0e0L,
 270    6.744982544979618754355808680196859521782e+0002L,
 271    1.810421795396966762032155290441364740350e+0005L,
 272    2.530986460644310651529583759699988435573e+0007L,
 273    2.026743276048023121360249288818290224145e+0009L,
 274    9.637461924407405935245269407052641341836e+0010L,
 275    2.732378628423766417402292797028314160831e+0012L,
 276    4.522345274960527124354844364012184278488e+0013L,
 277    4.160650668341743132685335758415469856545e+0014L,
 278    1.943730242988858208243492424892435901211e+0015L,
 279    3.880228532692127989901131618598067450001e+0015L,
 280    2.178020816161154615841000173683302999728e+0015L,
 281   -8.994062666842225551554346698171600634173e+0013L,
 282    1.368520368508851253495764806934619574990e+0013L,
 283 };

 284 static GENERIC pr2[12] = {
 285    1.000000000000000006938651621840396237282e+0000L,
 286    3.658416291850404981407101077037948144698e+0002L,
 287    5.267073772170356547709794670602812447537e+0004L,
 288    3.912012101226837463014925210735894620442e+0006L,
 289    1.651295648974103957193874928714180765625e+0008L,
 290    4.114901144480797609972484998142146783499e+0009L,
 291    6.092524309766036681542980572526335147672e+0010L,
 292    5.263913178071282616719249969074134570577e+0011L,
 293    2.538408581124324223367341020538081330994e+0012L,
 294    6.288607929360291027895126983015365677648e+0012L,
 295    6.848330048211148419047055075386525945280e+0012L,
 296    2.290309646838867941423178163991423244690e+0012L,
 297 };

 298 static GENERIC ps2[14] = {
 299    1.0e0L,
 300    3.657244416850405086459410165762319861856e+0002L,
 301    5.262802358425023243992387075861237306312e+0004L,
 302    3.905896813959919648136295861661483848364e+0006L,
 303    1.646791907791461220742694842108202772763e+0008L,
 304    4.096132803064256022224954120208201437344e+0009L,
 305    6.046665195915950447544429445730680236759e+0010L,
 306    5.198061739781991313414052212328653295168e+0011L,
 307    2.484233851814333966401527626421254279796e+0012L,
 308    6.047868806925315879339651539434315255940e+0012L,
 309    6.333103831254091652501642567294101813354e+0012L,
 310    1.875143098754284994467609936924685024968e+0012L,
 311   -5.238330920563392692965412762508813601534e+0010L,
 312    4.656888609439364725427789198383779259957e+0009L,
 313 };

 314 static GENERIC pr3[13] = {
 315    1.000000000000009336887318068056137842897e+0000L,
 316    2.242719942728459588488051572002835729183e+0002L,
 317    1.955450611382026550266257737331095691092e+0004L,
 318    8.707143293993619899395400562409175590739e+0005L,
 319    2.186267894487004565948324289010954505316e+0007L,
 320    3.224328510541957792360691585667502864688e+0008L,
 321    2.821057355151380597331792896882741364897e+0009L,
 322    1.445371387295422404365584793796028979840e+0010L,
 323    4.181743160669891357783011002656658107864e+0010L,
 324    6.387371088767993119325536137794535513922e+0010L,
 325    4.575619999412716078064070587767416436396e+0010L,
 326    1.228415651211639160620284441690503550842e+0010L,
 327    7.242170349875563053436050532153112882072e+0008L,
 328 };

 329 static GENERIC ps3[13] = {
 330    1.0e0L,
 331    2.241548067728529551049804610486061401070e+0002L,
 332    1.952838216795552145132137932931237181307e+0004L,
 333    8.684574926493185744628127341069974575526e+0005L,
 334    2.176357771067037962940853412819852189164e+0007L,
 335    3.199958682356132977319258783167122100567e+0008L,
 336    2.786218931525334687844675219914201872570e+0009L,
 337    1.416283776951741549631417572317916039767e+0010L,
 338    4.042962659271567948735676834609348842922e+0010L,
 339    6.028168462646694510083847222968444402161e+0010L,
 340    4.118410226794641413833887606580085281111e+0010L,
 341    9.918735736297038430744161253338202230263e+0009L,
 342    4.092967198238098023219124487437130332038e+0008L,
 343 };

 344 static GENERIC pr4[13] = {
 345    1.000000000001509220978157399042059553390e+0000L,
 346    1.437551868378147851133499996323782607787e+0002L,
 347    7.911335537418177296041518061404505428004e+0003L,
 348    2.193710939115317214716518908935756104804e+0005L,
 349    3.390662495136730962513489796538274984382e+0006L,
 350    3.048655347929348891006070609293884274789e+0007L,
 351    1.613781633489496606354045161527450975195e+0008L,
 352    4.975089835037230277110156150038482159988e+0008L,
 353    8.636047087015115403880904418339566323264e+0008L,
 354    7.918202912328366140110671223076949101509e+0008L,
 355    3.423294665798984733439650311722794853294e+0008L,
 356    5.621904953441963961040503934782662613621e+0007L,
 357    2.086303543310240260758670404509484499793e+0006L,
 358 };

 359 static GENERIC ps4[13] = {
 360    1.0e0L,
 361    1.436379993384532371670493319591847362304e+0002L,
 362    7.894647154785430678061053848847436659499e+0003L,
 363    2.184659753392097529008981741550878586174e+0005L,
 364    3.366109083305465176803513738147049499361e+0006L,
 365    3.011911545968996817697665866587226343186e+0007L,
 366    1.582262913779689851316760148459414895301e+0008L,
 367    4.819268809494937919217938589530138201770e+0008L,
 368    8.201355762990450679702837123432527154830e+0008L,
 369    7.268232093982510937417446421282341425212e+0008L,
 370    2.950911909015572933262131323934036480462e+0008L,
 371    4.242839924305934423010858966540621219396e+0007L,
 372    1.064387620445090779182117666330405186866e+0006L,
 373 };

 374 static GENERIC pr5[13] = {
 375    1.000000000102434805241171427253847353861e+0000L,
 376    9.129332257083629259060502249025963234821e+0001L,
 377    3.132238483586953037576119377504557191413e+0003L,
 378    5.329782528269307971278943122454171107861e+0004L,
 379    4.988460157184117790692873002103052944145e+0005L,
 380    2.686602071615786816147010334256047469378e+0006L,
 381    8.445418526028961197703799808701268301831e+0006L,
 382    1.536575358646141157475725889907900827390e+0007L,
 383    1.568405818236523821796862770586544811945e+0007L,
 384    8.450876239888770102387618667362302173547e+0006L,
 385    2.154414900139567328424026827163203446077e+0006L,
 386    2.105656926565043898888460254808062352205e+0005L,
 387    4.739165011023396507022134303736862812975e+0003L,
 388 };

 389 static GENERIC ps5[13] = {
 390    1.0e0L,
 391    9.117613509595327476509152673394703847793e+0001L,
 392    3.121697972484015639301279229281770795147e+0003L,
 393    5.294447222735893568040911873834576440255e+0004L,
 394    4.930368882192772335798256684110887882807e+0005L,
 395    2.634854685641165298302167435798357437768e+0006L,
 396    8.185462775400326393555896157031818280918e+0006L,
 397    1.462417423080215192609668642663030667086e+0007L,
 398    1.450624993985851675982860844153954896015e+0007L,
 399    7.460467647561995283219086567162006113864e+0006L,
 400    1.754210981405612478869227142579056338965e+0006L,
 401    1.463286721155271971526264914524746699596e+0005L,
 402    2.155894725796702015341211116579827039459e+0003L,
 403 };

 404 static GENERIC pr6[13] = {
 405    1.000000003564855546741735920315743157129e+0000L,
 406    5.734003934862540458119423509909510288366e+0001L,
 407    1.209572491935850486086559692291796887976e+0003L,
 408    1.243398391422281247933674779163660286838e+0004L,
 409    6.930996755181437937258220998601708278787e+0004L,
 410    2.198067659532757598646722249966767620099e+0005L,
 411    4.033659432712058633933179115820576858455e+0005L,
 412    4.257759657219008027016047206574574358678e+0005L,
 413    2.511917395876004349480721277445763916389e+0005L,
 414    7.813756153070623654178731651381881953552e+0004L,
 415    1.152069173381127881385588092905864352891e+0004L,
 416    6.548580782804088553777816037551523398082e+0002L,
 417    8.668725370116906132327542766127938496880e+0000L,
 418 };

 419 static GENERIC ps6[13] = {
 420    1.0e0L,
 421    5.722285236357114566499221525736286205184e+0001L,
 422    1.203010842878317935444582950620339570506e+0003L,
 423    1.230058335378583550155825502172435371208e+0004L,
 424    6.800998550607861288865300438648089894412e+0004L,
 425    2.130767829599304262987769347536850885921e+0005L,
 426    3.840483466643916681759936972992155310026e+0005L,
 427    3.947432373459225542861819148108081160393e+0005L,
 428    2.237816239393081111481588434457838526738e+0005L,
 429    6.545820495124419723398946273790921540774e+0004L,
 430    8.729563630320892741500726213278834737196e+0003L,
 431    4.130762660291894753450174794196998813709e+0002L,
 432    3.480368898672684645130335786015075595598e+0000L,
 433 };

 434 static GENERIC sixteen = 16.0L;
 435 static GENERIC eight   = 8.0L;
 436 static GENERIC huge    = 1.0e30L;
 437 
 438 static GENERIC pone(x)
 439 GENERIC x;

 440 {
 441         GENERIC s, r, t, z;
 442         int i;

 443         if (x > huge)
 444                 return (one);
 445         t = one/x; z = t*t;



 446         if (x > sixteen) {
 447             r = z*pr0[11]+pr0[10]; s = ps0[10];


 448             for (i = 9; i >= 0; i--) {
 449                 r = z*r + pr0[i];
 450                 s = z*s + ps0[i];
 451             }
 452         } else if (x > eight) {
 453             r = pr1[11]; s = ps1[11]+z*(ps1[12]+z*ps1[13]);


 454             for (i = 10; i >= 0; i--) {
 455                 r = z*r + pr1[i];
 456                 s = z*s + ps1[i];
 457             }
 458         } else if (x > five) {
 459             r = pr2[11]; s = ps2[11]+z*(ps2[12]+z*ps2[13]);


 460             for (i = 10; i >= 0; i--) {
 461                 r = z*r + pr2[i];
 462                 s = z*s + ps2[i];
 463             }
 464         } else if (x > 3.5L) {
 465             r = pr3[12]; s = ps3[12];


 466             for (i = 11; i >= 0; i--) {
 467                 r = z*r + pr3[i];
 468                 s = z*s + ps3[i];
 469             }
 470         } else if (x > 2.5L) {
 471             r = pr4[12]; s = ps4[12];


 472             for (i = 11; i >= 0; i--) {
 473                 r = z*r + pr4[i];
 474                 s = z*s + ps4[i];
 475             }
 476         } else if (x > (1.0L/0.5625L)) {
 477             r = pr5[12]; s = ps5[12];


 478             for (i = 11; i >= 0; i--) {
 479                 r = z*r + pr5[i];
 480                 s = z*s + ps5[i];
 481             }
 482         } else {                /* assume x > 1.28 */
 483             r = pr6[12]; s = ps6[12];


 484             for (i = 11; i >= 0; i--) {
 485                 r = z*r + pr6[i];
 486                 s = z*s + ps6[i];
 487             }
 488         }
 489         return (r/s);
 490 }
 491 
 492 


 493 static GENERIC qr0[12] = {
 494    3.749999999999999999999999999999999971033e-0001L,
 495    4.256726035237050601607682277433094262226e+0002L,
 496    1.875976490812878489192409978945401066066e+0005L,
 497    4.170314268048041914273603680317745592790e+0007L,
 498    5.092750132543855817293451118974555746551e+0009L,
 499    3.494749676278488654103505795794139483404e+0011L,
 500    1.327062148257437316997667817096694173709e+0013L,
 501    2.648993138273427226907503742066551150490e+0014L,
 502    2.511695665909547412222430494473998127684e+0015L,
 503    9.274694506662289043224310499164702306096e+0015L,
 504    8.150904170663663829331320302911792892002e+0015L,
 505   -5.001918733707662355772037829620388765122e+0014L,
 506 };

 507 static GENERIC qs0[11] = {
 508    1.0e0L,
 509    1.135400380229880160428715273982155760093e+0003L,
 510    5.005701183877126164326765545516590744360e+0005L,
 511    1.113444200113712167984337603933040102987e+0008L,
 512    1.361074819925223062778717565699039471124e+0010L,
 513    9.355750985802849484438933905325982809653e+0011L,
 514    3.563462786008988825003965543857998084828e+0013L,
 515    7.155145113900094163648726863803802910454e+0014L,
 516    6.871266835834472758055559013851843654113e+0015L,
 517    2.622030899226736712644974988157345234092e+0016L,
 518    2.602912729172876330650077021706139707746e+0016L,
 519 };

 520 static GENERIC qr1[12] = {
 521    3.749999999999999999997762458207284405806e-0001L,
 522    2.697883998881706839929255517498189980485e+0002L,
 523    7.755195925781028489386938870473834411019e+0004L,
 524    1.166777762104017777198211072895528968355e+0007L,
 525    1.011504772984321168320010084520261069362e+0009L,
 526    5.246007703574156853577754571720205550010e+0010L,
 527    1.637692549885592683166116551691266537647e+0012L,
 528    3.022303623698185669912990310925039382495e+0013L,
 529    3.154769927290655684846107030265909987946e+0014L,
 530    1.715819913441554770089730934808123360921e+0015L,
 531    4.165044355759732622273534445131736188510e+0015L,
 532    3.151381420874174705643100381708086287596e+0015L,
 533 };

 534 static GENERIC qs1[14] = {
 535    1.0e0L,
 536    7.197091705351218239785633172408276982828e+0002L,
 537    2.070012799599548685544883041297609861055e+0005L,
 538    3.117014815317656221871840152778458754516e+0007L,
 539    2.705719678902554974863325877025902971727e+0009L,
 540    1.406113614727345726925060648750867264098e+0011L,
 541    4.403777536067131320363005978631674817359e+0012L,
 542    8.170725690209322283061499386703167242894e+0013L,
 543    8.609458844975495289227794126964431210566e+0014L,
 544    4.766766367015473481257280600694952920204e+0015L,
 545    1.202286587943342194863557940888115641650e+0016L,
 546    1.012474328306200909525063936061756024120e+0016L,
 547    6.183552022678917858273222879615824070703e+0014L,
 548   -9.756731548558226997573737400988225722740e+0013L,
 549 };

 550 static GENERIC qr2[12] = {
 551    3.749999999999999481245647262226994293189e-0001L,
 552    1.471366807289771354491181140167359026735e+0002L,
 553    2.279432486768448220142080962843526951250e+0004L,
 554    1.828943048523771225163804043356958285893e+0006L,
 555    8.379828388647823135832220596417725010837e+0007L,
 556    2.279814029335044024585393671278378022053e+0009L,
 557    3.711653952257118120832817785271466441420e+0010L,
 558    3.557650914518554549916730572553105048068e+0011L,
 559    1.924583483146095896259774329498934160650e+0012L,
 560    5.424386256063736390759567088291887140278e+0012L,
 561    6.839325621241776786206509704671746841737e+0012L,
 562    2.702169563144001166291686452305436313971e+0012L,
 563 };

 564 static GENERIC qs2[14] = {
 565    1.0e0L,
 566    3.926379194439388135703211933895203191089e+0002L,
 567    6.089148804106598297488336063007609312276e+0004L,
 568    4.893546162973278583711376356041614150645e+0006L,
 569    2.247571119114497845046388801813832219404e+0008L,
 570    6.137635663350177751290469334200757872645e+0009L,
 571    1.005115019784102856424493519524998953678e+0011L,
 572    9.725664462014503832860151384604677240620e+0011L,
 573    5.345525100485511116148634192844434636072e+0012L,
 574    1.549944007398946691720862738173956994779e+0013L,
 575    2.067148441178952625710302124163264760362e+0013L,
 576    9.401565402641963611295119487242595462301e+0012L,
 577    3.548217088622398274748837287769709374385e+0011L,
 578   -2.934470341719047120076509938432417352365e+0010L,
 579 };

 580 static GENERIC qr3[13] = {
 581    3.749999999999412724084579833297451472091e-0001L,
 582    9.058478580291706212422978492938435582527e+0001L,
 583    8.524056033161038750461083666711724381171e+0003L,
 584    4.105967158629109427753434569223631014730e+0005L,
 585    1.118326603378531348259783091972623333657e+0007L,
 586    1.794636683403578918528064904714132329343e+0008L,
 587    1.714314157463635959556133236004368896724e+0009L,
 588    9.622092032236084846572067257267661456030e+0009L,
 589    3.057759524485859159957762858780768355020e+0010L,
 590    5.129306780754798531609621454415938890020e+0010L,
 591    3.999122002794961070680636194346316041352e+0010L,
 592    1.122298454643493485989721564358100345388e+0010L,
 593    5.603981987645989709668830968522362582221e+0008L,
 594 };

 595 static GENERIC qs3[13] = {
 596    1.0e0L,
 597    2.418328663076578169836155170053634419922e+0002L,
 598    2.279620205900121042587523541281272875520e+0004L,
 599    1.100984222585729521470129014992217092794e+0006L,
 600    3.010743223679247091004262516286654516282e+0007L,
 601    4.860925542827367817289619265215599433996e+0008L,
 602    4.686668111035348691982715864307839581243e+0009L,
 603    2.668701788405102017427214705946730894074e+0010L,
 604    8.677395746106802640390580944836650584903e+0010L,
 605    1.511936455574951790658498795945106643036e+0011L,
 606    1.260845604432623478002018696873608353093e+0011L,
 607    4.052692278419853853911440231600864589805e+0010L,
 608    2.965516519212226064983267822243329694729e+0009L,
 609 };

 610 static GENERIC qr4[13] = {
 611    3.749999999919234164154669754440123072618e-0001L,
 612    5.844218580776819864791168253485055101858e+0001L,
 613    3.489273514092912982675669411371435670220e+0003L,
 614    1.050523637774575684509663430018995479594e+0005L,
 615    1.764549172059701565500717319792780115289e+0006L,
 616    1.725532438844133795028063102681497371154e+0007L,
 617    9.938114847359778539965140247590176334874e+0007L,
 618    3.331710808184595545396883770200772842314e+0008L,
 619    6.271970557641881511609560444872797282698e+0008L,
 620    6.188529798677357075020774923903737913285e+0008L,
 621    2.821905302742849974509982167877885011629e+0008L,
 622    4.615467358646911976773290256984329814896e+0007L,
 623    1.348140608731546467396685802693380693275e+0006L,
 624 };

 625 static GENERIC qs4[13] = {
 626    1.0e0L,
 627    1.561192663112345185261418296389902133372e+0002L,
 628    9.346678031144098270547225423124213083072e+0003L,
 629    2.825851246482293547838023847601704751590e+0005L,
 630    4.776572711622156091710902891124911556293e+0006L,
 631    4.715106953717135402977938048006267859302e+0007L,
 632    2.753962350894311316439652227611209035193e+0008L,
 633    9.428501434615463207768964787500411575223e+0008L,
 634    1.832650858775206787088236896454141572617e+0009L,
 635    1.901697378939743226948920874296595242257e+0009L,
 636    9.433322226854293780627188599226380812725e+0008L,
 637    1.808520540608671608680284520798858587370e+0008L,
 638    7.983342331736662753157217446919462398008e+0006L,
 639 };

 640 static GENERIC qr5[13] = {
 641       3.749999995331364437028988850515190446719e-0001L,
 642       3.739356381766559882677514593041627547911e+0001L,
 643       1.399562500629413529355265462912819802551e+0003L,
 644       2.594154053098947925345332218062210111753e+0004L,
 645       2.640149879297408640394163979394594318371e+0005L,
 646       1.542471854873199142031889093591449397995e+0006L,
 647       5.242272868972053374067572098992335425895e+0006L,
 648       1.025834487769410221329633071426044839935e+0007L,
 649       1.116553924239448940142230579060124209622e+0007L,
 650       6.318076065595910176374916303525884653514e+0006L,
 651       1.641218086168640408527639735915512881785e+0006L,
 652       1.522369793529178644168813882912134706444e+0005L,
 653       2.526530541062297200914180060208669584055e+0003L,
 654 };

 655 static GENERIC qs5[13] = {
 656       1.0e0L,
 657       9.998960735935075380397545659016287506660e+0001L,
 658       3.758767417842043742686475060540416737562e+0003L,
 659       7.013652806952306520121959742519780781653e+0004L,
 660       7.208949808818615099246529616211730446850e+0005L,
 661       4.272753927109614455417836186072202009252e+0006L,
 662       1.482524411356470699336129814111025434703e+0007L,
 663       2.988750366665678233425279237627700803473e+0007L,
 664       3.396957890261080492694709150553619185065e+0007L,
 665       2.050652487738593004111578091156304540386e+0007L,
 666       5.900504120811732547616511555946279451316e+0006L,
 667       6.563391409260160897024498082273183468347e+0005L,
 668       1.692629845012790205348966731477187041419e+0004L,
 669 };

 670 static GENERIC qr6[13] = {
 671     3.749999861516664133157566870858975421296e-0001L,
 672     2.367863756747764863120797431599473468918e+0001L,
 673     5.476715802114976248882067325630793143777e+0002L,
 674     6.143190357869842894025012945444096170251e+0003L,
 675     3.716250534677997850513733595140463851730e+0004L,
 676     1.270883463823876752138326905022875657430e+0005L,
 677     2.495301449636814481646371665429083801388e+0005L,
 678     2.789578988212952248340486296254398601942e+0005L,
 679     1.718247946911109055931819087137397324634e+0005L,
 680     5.458973214011665714330326732204106364229e+0004L,
 681     7.912102686687948786048943339759596652813e+0003L,
 682     4.077961006160866935722030715149087938091e+0002L,
 683     3.765206972770245085551057237882528510428e+0000L,
 684 };

 685 static GENERIC qs6[13] = {
 686     1.0e0L,
 687     6.341646532940517305641893852673926809601e+0001L,
 688     1.477058277414040790932597537920671025359e+0003L,
 689     1.674406564031044491436044253393536487604e+0004L,
 690     1.028516501369755949895050806908994650768e+0005L,
 691     3.593620042532885295087463507733285434207e+0005L,
 692     7.267924991381020915185873399453724799625e+0005L,
 693     8.462277510768818399961191426205006083088e+0005L,
 694     5.514399892230892163373611895645500250514e+0005L,
 695     1.898084241009259353540620272932188102299e+0005L,
 696     3.102941242117739015721984123081026253068e+0004L,
 697     1.958971184431466907681440650181421086143e+0003L,
 698     2.878853357310495087181721613889455121867e+0001L,
 699 };
 700 static GENERIC qone(x)
 701 GENERIC x;


 702 {
 703         GENERIC s, r, t, z;
 704         int i;

 705         if (x > huge)
 706                 return (0.375L/x);
 707         t = one/x; z = t*t;



 708         if (x > sixteen) {
 709             r = z*qr0[11]+qr0[10]; s = qs0[10];


 710             for (i = 9; i >= 0; i--) {
 711                 r = z*r + qr0[i];
 712                 s = z*s + qs0[i];
 713             }
 714         } else if (x > eight) {
 715             r = qr1[11]; s = qs1[11]+z*(qs1[12]+z*qs1[13]);


 716             for (i = 10; i >= 0; i--) {
 717                 r = z*r + qr1[i];
 718                 s = z*s + qs1[i];
 719             }
 720         } else if (x > five) {       /* x > 5.0 */
 721             r = qr2[11]; s = qs2[11]+z*(qs2[12]+z*qs2[13]);


 722             for (i = 10; i >= 0; i--) {
 723                 r = z*r + qr2[i];
 724                 s = z*s + qs2[i];
 725             }
 726         } else if (x > 3.5L) {
 727             r = qr3[12]; s = qs3[12];


 728             for (i = 11; i >= 0; i--) {
 729                 r = z*r + qr3[i];
 730                 s = z*s + qs3[i];
 731             }
 732         } else if (x > 2.5L) {
 733             r = qr4[12]; s = qs4[12];


 734             for (i = 11; i >= 0; i--) {
 735                 r = z*r + qr4[i];
 736                 s = z*s + qs4[i];
 737             }
 738         } else if (x > (1.0L/0.5625L)) {
 739             r = qr5[12]; s = qs5[12];


 740             for (i = 11; i >= 0; i--) {
 741                 r = z*r + qr5[i];
 742                 s = z*s + qs5[i];
 743             }
 744         } else {                /* assume x > 1.28 */
 745             r = qr6[12]; s = qs6[12];


 746             for (i = 11; i >= 0; i--) {
 747                 r = z*r + qr6[i];
 748                 s = z*s + qs6[i];
 749             }
 750         }
 751         return (t*(r/s));

 752 }


   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  24  */
  25 
  26 /*
  27  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  28  * Use is subject to license terms.
  29  */
  30 
  31 /*
  32  * floating point Bessel's function of the first and second kinds
  33  * of order zero: j1(x),y1(x);
  34  *
  35  * Special cases:
  36  *      y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
  37  *      y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
  38  */
  39 
  40 #pragma weak __j1l = j1l
  41 #pragma weak __y1l = y1l
  42 
  43 #include "libm.h"
  44 #include "longdouble.h"
  45 #include <math.h>
  46 #if defined(__SUNPRO_C)
  47 #include <sunmath.h>
  48 #endif
  49 
  50 #define GENERIC long double
  51 
  52 static GENERIC zero = 0.0L,
  53         small = 1.0e-9L,
  54         tiny = 1.0e-38L,
  55         one = 1.0L,
  56         five = 5.0L,
  57         invsqrtpi = 5.641895835477562869480794515607725858441e-0001L,
  58         tpi = 0.636619772367581343075535053490057448L;
  59 
  60 static GENERIC pone(), qone();
  61 
  62 static GENERIC r0[7] = {
  63         -6.249999999999999999999999999999999627320e-0002L,
  64         1.940606727194041716205384618494641565464e-0003L,
  65         -3.005630423155733701856481469986459043883e-0005L,
  66         2.345586219403918667468341047369572169358e-0007L,
  67         -9.976809285885253587529010109133336669724e-0010L,
  68         2.218743258363623946078958783775107473381e-0012L,
  69         -2.071079656218700604767650924103578046280e-0015L,
  70 };
  71 
  72 static GENERIC s0[7] = {
  73         1.0e0L,
  74         1.061695903156199920738051277075003059555e-0002L,
  75         5.521860513111180371566951179398862692060e-0005L,
  76         1.824214367413754193524107877084979441407e-0007L,
  77         4.098957778439576834818838198039029353925e-0010L,
  78         6.047735079699666389853240090925264056197e-0013L,
  79         4.679044728878836197247923279512047035041e-0016L,
  80 };
  81 
  82 GENERIC
  83 j1l(GENERIC x)
  84 {
  85         GENERIC z, d, s, c, ss, cc, r;
  86         int i, sgn;
  87 
  88         if (!finitel(x))
  89                 return (one / x);
  90 
  91         sgn = signbitl(x);
  92         x = fabsl(x);
  93 
  94         if (x > 1.28L) {
  95                 s = sinl(x);
  96                 c = cosl(x);
  97 
  98                 /* BEGIN CSTYLED */
  99                 /*
 100                  * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x0)-q1(x)*sin(x0))
 101                  * where x0 = x-3pi/4
 102                  *      Better formula:
 103                  *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
 104                  *                      =  1/sqrt(2) * (sin(x) - cos(x))
 105                  *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
 106                  *                      = -1/sqrt(2) * (cos(x) + sin(x))
 107                  * To avoid cancellation, use
 108                  *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
 109                  * to compute the worse one.
 110                  */
 111                 /* END CSTYLED */
 112                 if (x > 1.0e2450L) { /* x+x may overflow */
 113                         ss = -s - c;
 114                         cc = s - c;
 115                 } else if (signbitl(s) != signbitl(c)) {
 116                         cc = s - c;
 117                         ss = cosl(x + x) / cc;
 118                 } else {
 119                         ss = -s - c;
 120                         cc = cosl(x + x) / ss;
 121                 }
 122 
 123                 /*
 124                  * j1(x) = 1/sqrt(pi*x) * (P(1,x)*cc - Q(1,x)*ss)
 125                  * y1(x) = 1/sqrt(pi*x) * (P(1,x)*ss + Q(1,x)*cc)
 126                  */
 127                 if (x > 1.0e120L)
 128                         return ((invsqrtpi * cc) / sqrtl(x));
 129 
 130                 d = invsqrtpi * (pone(x) * cc - qone(x) * ss) / sqrtl(x);
 131 
 132                 if (sgn == 0)
 133                         return (d);
 134                 else
 135                         return (-d);
 136         }
 137 
 138         if (x <= small) {
 139                 if (x <= tiny)
 140                         d = 0.5L * x;
 141                 else
 142                         d = x * (0.5L - x * x * 0.125L);
 143 
 144                 if (sgn == 0)
 145                         return (d);
 146                 else
 147                         return (-d);
 148         }
 149 
 150         z = x * x;
 151         r = r0[6];
 152         s = s0[6];
 153 
 154         for (i = 5; i >= 0; i--) {
 155                 r = r * z + r0[i];
 156                 s = s * z + s0[i];
 157         }
 158 
 159         d = x * 0.5L + x * (z * (r / s));
 160 
 161         if (sgn == 0)
 162                 return (d);
 163         else
 164                 return (-d);
 165 }
 166 
 167 static GENERIC u0[7] = {
 168         -1.960570906462389484060557273467558703503e-0001L,
 169         5.166389353148318460304315890665450006495e-0002L,
 170         -2.229699464105910913337190798743451115604e-0003L,
 171         3.625437034548863342715657067759078267158e-0005L,
 172         -2.689902826993117212255524537353883987171e-0007L,
 173         9.304570592456930912969387719010256018466e-0010L,
 174         -1.234878126794286643318321347997500346131e-0012L,
 175 };
 176 
 177 static GENERIC v0[8] = {
 178         1.0e0L,
 179         1.369394302535807332517110204820556695644e-0002L,
 180         9.508438148097659501433367062605935379588e-0005L,
 181         4.399007309420092056052714797296467565655e-0007L,
 182         1.488083087443756398305819693177715000787e-0009L,
 183         3.751609832625793536245746965768587624922e-0012L,
 184         6.680926434086257291872903276124244131448e-0015L,
 185         6.676602383908906988160099057991121446058e-0018L,
 186 };
 187 
 188 GENERIC
 189 y1l(GENERIC x)
 190 {
 191         GENERIC z, s, c, ss, cc, u, v;
 192         int i;
 193 
 194         if (isnanl(x))
 195                 return (x + x);
 196 
 197         if (x <= zero) {
 198                 if (x == zero)
 199                         return (-one / zero);
 200                 else
 201                         return (zero / zero);
 202         }
 203 
 204         if (x > 1.28L) {
 205                 if (!finitel(x))
 206                         return (zero);
 207 
 208                 s = sinl(x);
 209                 c = cosl(x);
 210 
 211                 /* BEGIN CSTYLED */
 212                 /*
 213                  * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x0)-q1(x)*sin(x0))
 214                  * where x0 = x-3pi/4
 215                  *      Better formula:
 216                  *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
 217                  *                      =  1/sqrt(2) * (sin(x) - cos(x))
 218                  *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
 219                  *                      = -1/sqrt(2) * (cos(x) + sin(x))
 220                  * To avoid cancellation, use
 221                  *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
 222                  * to compute the worse one.
 223                  */
 224                 /* END CSTYLED */
 225                 if (x > 1.0e2450L) { /* x+x may overflow */
 226                         ss = -s - c;
 227                         cc = s - c;
 228                 } else if (signbitl(s) != signbitl(c)) {
 229                         cc = s - c;
 230                         ss = cosl(x + x) / cc;
 231                 } else {
 232                         ss = -s - c;
 233                         cc = cosl(x + x) / ss;
 234                 }
 235 
 236                 /*
 237                  * j1(x) = 1/sqrt(pi*x) * (P(1,x)*cc - Q(1,x)*ss)
 238                  * y1(x) = 1/sqrt(pi*x) * (P(1,x)*ss + Q(1,x)*cc)
 239                  */
 240                 if (x > 1.0e91L)
 241                         return ((invsqrtpi * ss) / sqrtl(x));
 242 
 243                 return (invsqrtpi * (pone(x) * ss + qone(x) * cc) / sqrtl(x));


 244         }
 245 
 246         if (x <= tiny)
 247                 return (-tpi / x);
 248 
 249         z = x * x;
 250         u = u0[6];
 251         v = v0[6] + z * v0[7];
 252 
 253         for (i = 5; i >= 0; i--) {
 254                 u = u * z + u0[i];
 255                 v = v * z + v0[i];
 256         }
 257 
 258         return (x * (u / v) + tpi * (j1l(x) * logl(x) - one / x));
 259 }
 260 
 261 static GENERIC pr0[12] = {
 262         1.000000000000000000000000000000000000267e+0000L,
 263         1.060717875045891455602180843276758003035e+0003L,
 264         4.344347542892127024446687712181105852335e+0005L,
 265         8.915680220724007016377924252717410457094e+0007L,
 266         9.969502259938406062809873257569171272819e+0009L,
 267         6.200290193138613035646510338707386316595e+0011L,
 268         2.105978548788015119851815854422247330118e+0013L,
 269         3.696635772784601239371730810311998368948e+0014L,
 270         3.015913097920694682057958412534134515156e+0015L,
 271         9.370298471339353098123277427328592725921e+0015L,
 272         7.190349005196335967340799265074029443057e+0015L,
 273         2.736097786240689996880391074927552517982e+0014L,
 274 };
 275 
 276 static GENERIC ps0[11] = {
 277         1.0e0L,
 278         1.060600687545891455602180843276758095107e+0003L,
 279         4.343106093416975589147153906505338900961e+0005L,
 280         8.910605869002176566582072242244353399059e+0007L,
 281         9.959122058635087888690713917622056540190e+0009L,
 282         6.188744967234948231792482949171041843894e+0011L,
 283         2.098863976953783506401759873801990304907e+0013L,
 284         3.672870357018063196746729751479938908450e+0014L,
 285         2.975538419246824921049011529574385888420e+0015L,
 286         9.063657659995043205018686029284479837091e+0015L,
 287         6.401953344314747916729366441508892711691e+0015L,
 288 };
 289 
 290 static GENERIC pr1[12] = {
 291         1.000000000000000000000023667524130660984e+0000L,
 292         6.746154419979618754354803488126452971204e+0002L,
 293         1.811210781083390154857018330296145970502e+0005L,
 294         2.533098390379924268038005329095287842244e+0007L,
 295         2.029683619805342145252338570875424600729e+0009L,
 296         9.660859662192711465301069401598929980319e+0010L,
 297         2.743396238644831519934098967716621316316e+0012L,
 298         4.553097354140854377931023170263455246288e+0013L,
 299         4.210245069852219757476169864974870720374e+0014L,
 300         1.987334056229596485076645967176169801727e+0015L,
 301         4.067120052787096893838970455751338930462e+0015L,
 302         2.486539606380406398310845264910691398133e+0015L,
 303 };
 304 
 305 static GENERIC ps1[14] = {
 306         1.0e0L,
 307         6.744982544979618754355808680196859521782e+0002L,
 308         1.810421795396966762032155290441364740350e+0005L,
 309         2.530986460644310651529583759699988435573e+0007L,
 310         2.026743276048023121360249288818290224145e+0009L,
 311         9.637461924407405935245269407052641341836e+0010L,
 312         2.732378628423766417402292797028314160831e+0012L,
 313         4.522345274960527124354844364012184278488e+0013L,
 314         4.160650668341743132685335758415469856545e+0014L,
 315         1.943730242988858208243492424892435901211e+0015L,
 316         3.880228532692127989901131618598067450001e+0015L,
 317         2.178020816161154615841000173683302999728e+0015L,
 318         -8.994062666842225551554346698171600634173e+0013L,
 319         1.368520368508851253495764806934619574990e+0013L,
 320 };
 321 
 322 static GENERIC pr2[12] = {
 323         1.000000000000000006938651621840396237282e+0000L,
 324         3.658416291850404981407101077037948144698e+0002L,
 325         5.267073772170356547709794670602812447537e+0004L,
 326         3.912012101226837463014925210735894620442e+0006L,
 327         1.651295648974103957193874928714180765625e+0008L,
 328         4.114901144480797609972484998142146783499e+0009L,
 329         6.092524309766036681542980572526335147672e+0010L,
 330         5.263913178071282616719249969074134570577e+0011L,
 331         2.538408581124324223367341020538081330994e+0012L,
 332         6.288607929360291027895126983015365677648e+0012L,
 333         6.848330048211148419047055075386525945280e+0012L,
 334         2.290309646838867941423178163991423244690e+0012L,
 335 };
 336 
 337 static GENERIC ps2[14] = {
 338         1.0e0L,
 339         3.657244416850405086459410165762319861856e+0002L,
 340         5.262802358425023243992387075861237306312e+0004L,
 341         3.905896813959919648136295861661483848364e+0006L,
 342         1.646791907791461220742694842108202772763e+0008L,
 343         4.096132803064256022224954120208201437344e+0009L,
 344         6.046665195915950447544429445730680236759e+0010L,
 345         5.198061739781991313414052212328653295168e+0011L,
 346         2.484233851814333966401527626421254279796e+0012L,
 347         6.047868806925315879339651539434315255940e+0012L,
 348         6.333103831254091652501642567294101813354e+0012L,
 349         1.875143098754284994467609936924685024968e+0012L,
 350         -5.238330920563392692965412762508813601534e+0010L,
 351         4.656888609439364725427789198383779259957e+0009L,
 352 };
 353 
 354 static GENERIC pr3[13] = {
 355         1.000000000000009336887318068056137842897e+0000L,
 356         2.242719942728459588488051572002835729183e+0002L,
 357         1.955450611382026550266257737331095691092e+0004L,
 358         8.707143293993619899395400562409175590739e+0005L,
 359         2.186267894487004565948324289010954505316e+0007L,
 360         3.224328510541957792360691585667502864688e+0008L,
 361         2.821057355151380597331792896882741364897e+0009L,
 362         1.445371387295422404365584793796028979840e+0010L,
 363         4.181743160669891357783011002656658107864e+0010L,
 364         6.387371088767993119325536137794535513922e+0010L,
 365         4.575619999412716078064070587767416436396e+0010L,
 366         1.228415651211639160620284441690503550842e+0010L,
 367         7.242170349875563053436050532153112882072e+0008L,
 368 };
 369 
 370 static GENERIC ps3[13] = {
 371         1.0e0L,
 372         2.241548067728529551049804610486061401070e+0002L,
 373         1.952838216795552145132137932931237181307e+0004L,
 374         8.684574926493185744628127341069974575526e+0005L,
 375         2.176357771067037962940853412819852189164e+0007L,
 376         3.199958682356132977319258783167122100567e+0008L,
 377         2.786218931525334687844675219914201872570e+0009L,
 378         1.416283776951741549631417572317916039767e+0010L,
 379         4.042962659271567948735676834609348842922e+0010L,
 380         6.028168462646694510083847222968444402161e+0010L,
 381         4.118410226794641413833887606580085281111e+0010L,
 382         9.918735736297038430744161253338202230263e+0009L,
 383         4.092967198238098023219124487437130332038e+0008L,
 384 };
 385 
 386 static GENERIC pr4[13] = {
 387         1.000000000001509220978157399042059553390e+0000L,
 388         1.437551868378147851133499996323782607787e+0002L,
 389         7.911335537418177296041518061404505428004e+0003L,
 390         2.193710939115317214716518908935756104804e+0005L,
 391         3.390662495136730962513489796538274984382e+0006L,
 392         3.048655347929348891006070609293884274789e+0007L,
 393         1.613781633489496606354045161527450975195e+0008L,
 394         4.975089835037230277110156150038482159988e+0008L,
 395         8.636047087015115403880904418339566323264e+0008L,
 396         7.918202912328366140110671223076949101509e+0008L,
 397         3.423294665798984733439650311722794853294e+0008L,
 398         5.621904953441963961040503934782662613621e+0007L,
 399         2.086303543310240260758670404509484499793e+0006L,
 400 };
 401 
 402 static GENERIC ps4[13] = {
 403         1.0e0L,
 404         1.436379993384532371670493319591847362304e+0002L,
 405         7.894647154785430678061053848847436659499e+0003L,
 406         2.184659753392097529008981741550878586174e+0005L,
 407         3.366109083305465176803513738147049499361e+0006L,
 408         3.011911545968996817697665866587226343186e+0007L,
 409         1.582262913779689851316760148459414895301e+0008L,
 410         4.819268809494937919217938589530138201770e+0008L,
 411         8.201355762990450679702837123432527154830e+0008L,
 412         7.268232093982510937417446421282341425212e+0008L,
 413         2.950911909015572933262131323934036480462e+0008L,
 414         4.242839924305934423010858966540621219396e+0007L,
 415         1.064387620445090779182117666330405186866e+0006L,
 416 };
 417 
 418 static GENERIC pr5[13] = {
 419         1.000000000102434805241171427253847353861e+0000L,
 420         9.129332257083629259060502249025963234821e+0001L,
 421         3.132238483586953037576119377504557191413e+0003L,
 422         5.329782528269307971278943122454171107861e+0004L,
 423         4.988460157184117790692873002103052944145e+0005L,
 424         2.686602071615786816147010334256047469378e+0006L,
 425         8.445418526028961197703799808701268301831e+0006L,
 426         1.536575358646141157475725889907900827390e+0007L,
 427         1.568405818236523821796862770586544811945e+0007L,
 428         8.450876239888770102387618667362302173547e+0006L,
 429         2.154414900139567328424026827163203446077e+0006L,
 430         2.105656926565043898888460254808062352205e+0005L,
 431         4.739165011023396507022134303736862812975e+0003L,
 432 };
 433 
 434 static GENERIC ps5[13] = {
 435         1.0e0L,
 436         9.117613509595327476509152673394703847793e+0001L,
 437         3.121697972484015639301279229281770795147e+0003L,
 438         5.294447222735893568040911873834576440255e+0004L,
 439         4.930368882192772335798256684110887882807e+0005L,
 440         2.634854685641165298302167435798357437768e+0006L,
 441         8.185462775400326393555896157031818280918e+0006L,
 442         1.462417423080215192609668642663030667086e+0007L,
 443         1.450624993985851675982860844153954896015e+0007L,
 444         7.460467647561995283219086567162006113864e+0006L,
 445         1.754210981405612478869227142579056338965e+0006L,
 446         1.463286721155271971526264914524746699596e+0005L,
 447         2.155894725796702015341211116579827039459e+0003L,
 448 };
 449 
 450 static GENERIC pr6[13] = {
 451         1.000000003564855546741735920315743157129e+0000L,
 452         5.734003934862540458119423509909510288366e+0001L,
 453         1.209572491935850486086559692291796887976e+0003L,
 454         1.243398391422281247933674779163660286838e+0004L,
 455         6.930996755181437937258220998601708278787e+0004L,
 456         2.198067659532757598646722249966767620099e+0005L,
 457         4.033659432712058633933179115820576858455e+0005L,
 458         4.257759657219008027016047206574574358678e+0005L,
 459         2.511917395876004349480721277445763916389e+0005L,
 460         7.813756153070623654178731651381881953552e+0004L,
 461         1.152069173381127881385588092905864352891e+0004L,
 462         6.548580782804088553777816037551523398082e+0002L,
 463         8.668725370116906132327542766127938496880e+0000L,
 464 };
 465 
 466 static GENERIC ps6[13] = {
 467         1.0e0L,
 468         5.722285236357114566499221525736286205184e+0001L,
 469         1.203010842878317935444582950620339570506e+0003L,
 470         1.230058335378583550155825502172435371208e+0004L,
 471         6.800998550607861288865300438648089894412e+0004L,
 472         2.130767829599304262987769347536850885921e+0005L,
 473         3.840483466643916681759936972992155310026e+0005L,
 474         3.947432373459225542861819148108081160393e+0005L,
 475         2.237816239393081111481588434457838526738e+0005L,
 476         6.545820495124419723398946273790921540774e+0004L,
 477         8.729563630320892741500726213278834737196e+0003L,
 478         4.130762660291894753450174794196998813709e+0002L,
 479         3.480368898672684645130335786015075595598e+0000L,
 480 };
 481 
 482 static GENERIC sixteen = 16.0L;
 483 static GENERIC eight = 8.0L;
 484 static GENERIC huge = 1.0e30L;
 485 
 486 static GENERIC
 487 pone(x)
 488     GENERIC x;
 489 {
 490         GENERIC s, r, t, z;
 491         int i;
 492 
 493         if (x > huge)
 494                 return (one);
 495 
 496         t = one / x;
 497         z = t * t;
 498 
 499         if (x > sixteen) {
 500                 r = z * pr0[11] + pr0[10];
 501                 s = ps0[10];
 502 
 503                 for (i = 9; i >= 0; i--) {
 504                         r = z * r + pr0[i];
 505                         s = z * s + ps0[i];
 506                 }
 507         } else if (x > eight) {
 508                 r = pr1[11];
 509                 s = ps1[11] + z * (ps1[12] + z * ps1[13]);
 510 
 511                 for (i = 10; i >= 0; i--) {
 512                         r = z * r + pr1[i];
 513                         s = z * s + ps1[i];
 514                 }
 515         } else if (x > five) {
 516                 r = pr2[11];
 517                 s = ps2[11] + z * (ps2[12] + z * ps2[13]);
 518 
 519                 for (i = 10; i >= 0; i--) {
 520                         r = z * r + pr2[i];
 521                         s = z * s + ps2[i];
 522                 }
 523         } else if (x > 3.5L) {
 524                 r = pr3[12];
 525                 s = ps3[12];
 526 
 527                 for (i = 11; i >= 0; i--) {
 528                         r = z * r + pr3[i];
 529                         s = z * s + ps3[i];
 530                 }
 531         } else if (x > 2.5L) {
 532                 r = pr4[12];
 533                 s = ps4[12];
 534 
 535                 for (i = 11; i >= 0; i--) {
 536                         r = z * r + pr4[i];
 537                         s = z * s + ps4[i];
 538                 }
 539         } else if (x > (1.0L / 0.5625L)) {
 540                 r = pr5[12];
 541                 s = ps5[12];
 542 
 543                 for (i = 11; i >= 0; i--) {
 544                         r = z * r + pr5[i];
 545                         s = z * s + ps5[i];
 546                 }
 547         } else {                        /* assume x > 1.28 */
 548                 r = pr6[12];
 549                 s = ps6[12];
 550 
 551                 for (i = 11; i >= 0; i--) {
 552                         r = z * r + pr6[i];
 553                         s = z * s + ps6[i];
 554                 }
 555         }



 556 
 557         return (r / s);
 558 }
 559 static GENERIC qr0[12] = {
 560         3.749999999999999999999999999999999971033e-0001L,
 561         4.256726035237050601607682277433094262226e+0002L,
 562         1.875976490812878489192409978945401066066e+0005L,
 563         4.170314268048041914273603680317745592790e+0007L,
 564         5.092750132543855817293451118974555746551e+0009L,
 565         3.494749676278488654103505795794139483404e+0011L,
 566         1.327062148257437316997667817096694173709e+0013L,
 567         2.648993138273427226907503742066551150490e+0014L,
 568         2.511695665909547412222430494473998127684e+0015L,
 569         9.274694506662289043224310499164702306096e+0015L,
 570         8.150904170663663829331320302911792892002e+0015L,
 571         -5.001918733707662355772037829620388765122e+0014L,
 572 };
 573 
 574 static GENERIC qs0[11] = {
 575         1.0e0L,
 576         1.135400380229880160428715273982155760093e+0003L,
 577         5.005701183877126164326765545516590744360e+0005L,
 578         1.113444200113712167984337603933040102987e+0008L,
 579         1.361074819925223062778717565699039471124e+0010L,
 580         9.355750985802849484438933905325982809653e+0011L,
 581         3.563462786008988825003965543857998084828e+0013L,
 582         7.155145113900094163648726863803802910454e+0014L,
 583         6.871266835834472758055559013851843654113e+0015L,
 584         2.622030899226736712644974988157345234092e+0016L,
 585         2.602912729172876330650077021706139707746e+0016L,
 586 };
 587 
 588 static GENERIC qr1[12] = {
 589         3.749999999999999999997762458207284405806e-0001L,
 590         2.697883998881706839929255517498189980485e+0002L,
 591         7.755195925781028489386938870473834411019e+0004L,
 592         1.166777762104017777198211072895528968355e+0007L,
 593         1.011504772984321168320010084520261069362e+0009L,
 594         5.246007703574156853577754571720205550010e+0010L,
 595         1.637692549885592683166116551691266537647e+0012L,
 596         3.022303623698185669912990310925039382495e+0013L,
 597         3.154769927290655684846107030265909987946e+0014L,
 598         1.715819913441554770089730934808123360921e+0015L,
 599         4.165044355759732622273534445131736188510e+0015L,
 600         3.151381420874174705643100381708086287596e+0015L,
 601 };
 602 
 603 static GENERIC qs1[14] = {
 604         1.0e0L,
 605         7.197091705351218239785633172408276982828e+0002L,
 606         2.070012799599548685544883041297609861055e+0005L,
 607         3.117014815317656221871840152778458754516e+0007L,
 608         2.705719678902554974863325877025902971727e+0009L,
 609         1.406113614727345726925060648750867264098e+0011L,
 610         4.403777536067131320363005978631674817359e+0012L,
 611         8.170725690209322283061499386703167242894e+0013L,
 612         8.609458844975495289227794126964431210566e+0014L,
 613         4.766766367015473481257280600694952920204e+0015L,
 614         1.202286587943342194863557940888115641650e+0016L,
 615         1.012474328306200909525063936061756024120e+0016L,
 616         6.183552022678917858273222879615824070703e+0014L,
 617         -9.756731548558226997573737400988225722740e+0013L,
 618 };
 619 
 620 static GENERIC qr2[12] = {
 621         3.749999999999999481245647262226994293189e-0001L,
 622         1.471366807289771354491181140167359026735e+0002L,
 623         2.279432486768448220142080962843526951250e+0004L,
 624         1.828943048523771225163804043356958285893e+0006L,
 625         8.379828388647823135832220596417725010837e+0007L,
 626         2.279814029335044024585393671278378022053e+0009L,
 627         3.711653952257118120832817785271466441420e+0010L,
 628         3.557650914518554549916730572553105048068e+0011L,
 629         1.924583483146095896259774329498934160650e+0012L,
 630         5.424386256063736390759567088291887140278e+0012L,
 631         6.839325621241776786206509704671746841737e+0012L,
 632         2.702169563144001166291686452305436313971e+0012L,
 633 };
 634 
 635 static GENERIC qs2[14] = {
 636         1.0e0L,
 637         3.926379194439388135703211933895203191089e+0002L,
 638         6.089148804106598297488336063007609312276e+0004L,
 639         4.893546162973278583711376356041614150645e+0006L,
 640         2.247571119114497845046388801813832219404e+0008L,
 641         6.137635663350177751290469334200757872645e+0009L,
 642         1.005115019784102856424493519524998953678e+0011L,
 643         9.725664462014503832860151384604677240620e+0011L,
 644         5.345525100485511116148634192844434636072e+0012L,
 645         1.549944007398946691720862738173956994779e+0013L,
 646         2.067148441178952625710302124163264760362e+0013L,
 647         9.401565402641963611295119487242595462301e+0012L,
 648         3.548217088622398274748837287769709374385e+0011L,
 649         -2.934470341719047120076509938432417352365e+0010L,
 650 };
 651 
 652 static GENERIC qr3[13] = {
 653         3.749999999999412724084579833297451472091e-0001L,
 654         9.058478580291706212422978492938435582527e+0001L,
 655         8.524056033161038750461083666711724381171e+0003L,
 656         4.105967158629109427753434569223631014730e+0005L,
 657         1.118326603378531348259783091972623333657e+0007L,
 658         1.794636683403578918528064904714132329343e+0008L,
 659         1.714314157463635959556133236004368896724e+0009L,
 660         9.622092032236084846572067257267661456030e+0009L,
 661         3.057759524485859159957762858780768355020e+0010L,
 662         5.129306780754798531609621454415938890020e+0010L,
 663         3.999122002794961070680636194346316041352e+0010L,
 664         1.122298454643493485989721564358100345388e+0010L,
 665         5.603981987645989709668830968522362582221e+0008L,
 666 };
 667 
 668 static GENERIC qs3[13] = {
 669         1.0e0L,
 670         2.418328663076578169836155170053634419922e+0002L,
 671         2.279620205900121042587523541281272875520e+0004L,
 672         1.100984222585729521470129014992217092794e+0006L,
 673         3.010743223679247091004262516286654516282e+0007L,
 674         4.860925542827367817289619265215599433996e+0008L,
 675         4.686668111035348691982715864307839581243e+0009L,
 676         2.668701788405102017427214705946730894074e+0010L,
 677         8.677395746106802640390580944836650584903e+0010L,
 678         1.511936455574951790658498795945106643036e+0011L,
 679         1.260845604432623478002018696873608353093e+0011L,
 680         4.052692278419853853911440231600864589805e+0010L,
 681         2.965516519212226064983267822243329694729e+0009L,
 682 };
 683 
 684 static GENERIC qr4[13] = {
 685         3.749999999919234164154669754440123072618e-0001L,
 686         5.844218580776819864791168253485055101858e+0001L,
 687         3.489273514092912982675669411371435670220e+0003L,
 688         1.050523637774575684509663430018995479594e+0005L,
 689         1.764549172059701565500717319792780115289e+0006L,
 690         1.725532438844133795028063102681497371154e+0007L,
 691         9.938114847359778539965140247590176334874e+0007L,
 692         3.331710808184595545396883770200772842314e+0008L,
 693         6.271970557641881511609560444872797282698e+0008L,
 694         6.188529798677357075020774923903737913285e+0008L,
 695         2.821905302742849974509982167877885011629e+0008L,
 696         4.615467358646911976773290256984329814896e+0007L,
 697         1.348140608731546467396685802693380693275e+0006L,
 698 };
 699 
 700 static GENERIC qs4[13] = {
 701         1.0e0L,
 702         1.561192663112345185261418296389902133372e+0002L,
 703         9.346678031144098270547225423124213083072e+0003L,
 704         2.825851246482293547838023847601704751590e+0005L,
 705         4.776572711622156091710902891124911556293e+0006L,
 706         4.715106953717135402977938048006267859302e+0007L,
 707         2.753962350894311316439652227611209035193e+0008L,
 708         9.428501434615463207768964787500411575223e+0008L,
 709         1.832650858775206787088236896454141572617e+0009L,
 710         1.901697378939743226948920874296595242257e+0009L,
 711         9.433322226854293780627188599226380812725e+0008L,
 712         1.808520540608671608680284520798858587370e+0008L,
 713         7.983342331736662753157217446919462398008e+0006L,
 714 };
 715 
 716 static GENERIC qr5[13] = {
 717         3.749999995331364437028988850515190446719e-0001L,
 718         3.739356381766559882677514593041627547911e+0001L,
 719         1.399562500629413529355265462912819802551e+0003L,
 720         2.594154053098947925345332218062210111753e+0004L,
 721         2.640149879297408640394163979394594318371e+0005L,
 722         1.542471854873199142031889093591449397995e+0006L,
 723         5.242272868972053374067572098992335425895e+0006L,
 724         1.025834487769410221329633071426044839935e+0007L,
 725         1.116553924239448940142230579060124209622e+0007L,
 726         6.318076065595910176374916303525884653514e+0006L,
 727         1.641218086168640408527639735915512881785e+0006L,
 728         1.522369793529178644168813882912134706444e+0005L,
 729         2.526530541062297200914180060208669584055e+0003L,
 730 };
 731 
 732 static GENERIC qs5[13] = {
 733         1.0e0L,
 734         9.998960735935075380397545659016287506660e+0001L,
 735         3.758767417842043742686475060540416737562e+0003L,
 736         7.013652806952306520121959742519780781653e+0004L,
 737         7.208949808818615099246529616211730446850e+0005L,
 738         4.272753927109614455417836186072202009252e+0006L,
 739         1.482524411356470699336129814111025434703e+0007L,
 740         2.988750366665678233425279237627700803473e+0007L,
 741         3.396957890261080492694709150553619185065e+0007L,
 742         2.050652487738593004111578091156304540386e+0007L,
 743         5.900504120811732547616511555946279451316e+0006L,
 744         6.563391409260160897024498082273183468347e+0005L,
 745         1.692629845012790205348966731477187041419e+0004L,
 746 };
 747 
 748 static GENERIC qr6[13] = {
 749         3.749999861516664133157566870858975421296e-0001L,
 750         2.367863756747764863120797431599473468918e+0001L,
 751         5.476715802114976248882067325630793143777e+0002L,
 752         6.143190357869842894025012945444096170251e+0003L,
 753         3.716250534677997850513733595140463851730e+0004L,
 754         1.270883463823876752138326905022875657430e+0005L,
 755         2.495301449636814481646371665429083801388e+0005L,
 756         2.789578988212952248340486296254398601942e+0005L,
 757         1.718247946911109055931819087137397324634e+0005L,
 758         5.458973214011665714330326732204106364229e+0004L,
 759         7.912102686687948786048943339759596652813e+0003L,
 760         4.077961006160866935722030715149087938091e+0002L,
 761         3.765206972770245085551057237882528510428e+0000L,
 762 };
 763 
 764 static GENERIC qs6[13] = {
 765         1.0e0L,
 766         6.341646532940517305641893852673926809601e+0001L,
 767         1.477058277414040790932597537920671025359e+0003L,
 768         1.674406564031044491436044253393536487604e+0004L,
 769         1.028516501369755949895050806908994650768e+0005L,
 770         3.593620042532885295087463507733285434207e+0005L,
 771         7.267924991381020915185873399453724799625e+0005L,
 772         8.462277510768818399961191426205006083088e+0005L,
 773         5.514399892230892163373611895645500250514e+0005L,
 774         1.898084241009259353540620272932188102299e+0005L,
 775         3.102941242117739015721984123081026253068e+0004L,
 776         1.958971184431466907681440650181421086143e+0003L,
 777         2.878853357310495087181721613889455121867e+0001L,
 778 };
 779 
 780 static GENERIC
 781 qone(x)
 782     GENERIC x;
 783 {
 784         GENERIC s, r, t, z;
 785         int i;
 786 
 787         if (x > huge)
 788                 return (0.375L / x);
 789 
 790         t = one / x;
 791         z = t * t;
 792 
 793         if (x > sixteen) {
 794                 r = z * qr0[11] + qr0[10];
 795                 s = qs0[10];
 796 
 797                 for (i = 9; i >= 0; i--) {
 798                         r = z * r + qr0[i];
 799                         s = z * s + qs0[i];
 800                 }
 801         } else if (x > eight) {
 802                 r = qr1[11];
 803                 s = qs1[11] + z * (qs1[12] + z * qs1[13]);
 804 
 805                 for (i = 10; i >= 0; i--) {
 806                         r = z * r + qr1[i];
 807                         s = z * s + qs1[i];
 808                 }
 809         } else if (x > five) {               /* x > 5.0 */
 810                 r = qr2[11];
 811                 s = qs2[11] + z * (qs2[12] + z * qs2[13]);
 812 
 813                 for (i = 10; i >= 0; i--) {
 814                         r = z * r + qr2[i];
 815                         s = z * s + qs2[i];
 816                 }
 817         } else if (x > 3.5L) {
 818                 r = qr3[12];
 819                 s = qs3[12];
 820 
 821                 for (i = 11; i >= 0; i--) {
 822                         r = z * r + qr3[i];
 823                         s = z * s + qs3[i];
 824                 }
 825         } else if (x > 2.5L) {
 826                 r = qr4[12];
 827                 s = qs4[12];
 828 
 829                 for (i = 11; i >= 0; i--) {
 830                         r = z * r + qr4[i];
 831                         s = z * s + qs4[i];
 832                 }
 833         } else if (x > (1.0L / 0.5625L)) {
 834                 r = qr5[12];
 835                 s = qs5[12];
 836 
 837                 for (i = 11; i >= 0; i--) {
 838                         r = z * r + qr5[i];
 839                         s = z * s + qs5[i];
 840                 }
 841         } else {                        /* assume x > 1.28 */
 842                 r = qr6[12];
 843                 s = qs6[12];
 844 
 845                 for (i = 11; i >= 0; i--) {
 846                         r = z * r + qr6[i];
 847                         s = z * s + qs6[i];
 848                 }
 849         }
 850 
 851         return (t * (r / s));
 852 }