1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 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: j0(x),y0(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 __j0l = j0l 41 #pragma weak __y0l = y0l 42 43 #include "libm.h" 44 45 #include "longdouble.h" 46 47 #include <math.h> 48 #if defined(__SUNPRO_C) 49 #include <sunmath.h> 50 #endif 51 52 #define GENERIC long double 53 54 static GENERIC zero = 0.0L, 55 small = 1.0e-9L, 56 tiny = 1.0e-38L, 57 one = 1.0L, 58 five = 5.0L, 59 eight = 8.0L, 60 invsqrtpi = 5.641895835477562869480794515607725858441e-0001L, 61 tpi = 0.636619772367581343075535053490057448L; 62 63 static GENERIC pzero(), qzero(); 64 65 static GENERIC r0[7] = { 66 -2.499999999999999999999999999999998934492e-0001L, 67 1.272657927360049786327618451133763714880e-0002L, 68 -2.694499763712963276900636693400659600898e-0004L, 69 2.724877475058977576903234070919616447883e-0006L, 70 -1.432617103214330236967477495393076320281e-0008L, 71 3.823248804080079168706683540513792224471e-0011L, 72 -4.183174277567983647337568504286313665065e-0014L, 73 }; 74 75 static GENERIC s0[7] = { 76 1.0e0L, 77 1.159368290559800854689526195462884666395e-0002L, 78 6.629397597394973383009743876169946772559e-0005L, 79 2.426779981394054406305431142501735094340e-0007L, 80 6.097663491248511069094400469635449749883e-0010L, 81 1.017019133340929220238747413216052224036e-0012L, 82 9.012593179306197579518374581969371278481e-0016L, 83 }; 84 85 GENERIC 86 j0l(GENERIC x) 87 { 88 GENERIC z, s, c, ss, cc, r, u, v; 89 int i; 90 91 if (isnanl(x)) 92 return (x + x); 93 94 x = fabsl(x); 95 96 if (x > 1.28L) { 97 if (!finitel(x)) 98 return (zero); 99 100 s = sinl(x); 101 c = cosl(x); 102 103 /* BEGIN CSTYLED */ 104 /* 105 * j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0)) 106 * where x0 = x-pi/4 107 * Better formula: 108 * cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4) 109 * = 1/sqrt(2) * (cos(x) + sin(x)) 110 * sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4) 111 * = 1/sqrt(2) * (sin(x) - cos(x)) 112 * To avoid cancellation, use 113 * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) 114 * to compute the worse one. 115 */ 116 /* END CSTYLED */ 117 if (x > 1.0e2450L) { /* x+x may overflow */ 118 ss = s - c; 119 cc = s + c; 120 } else if (signbitl(s) != signbitl(c)) { 121 ss = s - c; 122 cc = -cosl(x + x) / ss; 123 } else { 124 cc = s + c; 125 ss = -cosl(x + x) / cc; 126 } 127 128 /* 129 * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x) 130 * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x) 131 */ 132 if (x > 1.0e120L) 133 return ((invsqrtpi * cc) / sqrtl(x)); 134 135 u = pzero(x); 136 v = qzero(x); 137 return (invsqrtpi * (u * cc - v * ss) / sqrtl(x)); 138 } 139 140 if (x <= small) { 141 if (x <= tiny) 142 return (one - x); 143 else 144 return (one - x * x * 0.25L); 145 } 146 147 z = x * x; 148 r = r0[6]; 149 s = s0[6]; 150 151 for (i = 5; i >= 0; i--) { 152 r = r * z + r0[i]; 153 s = s * z + s0[i]; 154 } 155 156 return (one + z * (r / s)); 157 } 158 159 static GENERIC u0[8] = { 160 -7.380429510868722527434392794848301631220e-0002L, 161 1.766855559625940791857536949301981816513e-0001L, 162 -1.386470722701047923235553251240162839408e-0002L, 163 3.520149242724811578636970811631224862615e-0004L, 164 -3.978599663243790049853642275624951870025e-0006L, 165 2.228801153263957224547222556806915479763e-0008L, 166 -6.121246764298785018658597179498837316177e-0011L, 167 6.677103629722678833475965810525587396596e-0014L, 168 }; 169 170 static GENERIC v0[8] = { 171 1.0e0L, 172 1.247164416539111311571676766127767127970e-0002L, 173 7.829144749639791500052900281489367443576e-0005L, 174 3.247126540422245330511218321013360336606e-0007L, 175 9.750516724789499678567062572549568447869e-0010L, 176 2.156713223173591212250543390258458098776e-0012L, 177 3.322169561597890004231482431236452752624e-0015L, 178 2.821213295314000924252226486305726805093e-0018L, 179 }; 180 181 GENERIC 182 y0l(GENERIC x) 183 { 184 GENERIC z, s, c, ss, cc, u, v; 185 GENERIC d __unused; 186 int i; 187 188 if (isnanl(x)) 189 return (x + x); 190 191 if (x <= zero) { 192 if (x == zero) 193 d = -one / (x - x); 194 else 195 d = zero / (x - x); 196 } 197 198 if (x > 1.28L) { 199 if (!finitel(x)) 200 return (zero); 201 202 s = sinl(x); 203 c = cosl(x); 204 205 /* BEGIN CSTYLED */ 206 /* 207 * j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0)) 208 * where x0 = x-pi/4 209 * Better formula: 210 * cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4) 211 * = 1/sqrt(2) * (cos(x) + sin(x)) 212 * sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4) 213 * = 1/sqrt(2) * (sin(x) - cos(x)) 214 * To avoid cancellation, use 215 * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) 216 * to compute the worse one. 217 */ 218 /* END CSTYLED */ 219 if (x > 1.0e2450L) { /* x+x may overflow */ 220 ss = s - c; 221 cc = s + c; 222 } else if (signbitl(s) != signbitl(c)) { 223 ss = s - c; 224 cc = -cosl(x + x) / ss; 225 } else { 226 cc = s + c; 227 ss = -cosl(x + x) / cc; 228 } 229 230 /* 231 * j0(x) = 1/sqrt(pi*x) * (P(0,x)*cc - Q(0,x)*ss) 232 * y0(x) = 1/sqrt(pi*x) * (P(0,x)*ss + Q(0,x)*cc) 233 */ 234 if (x > 1.0e120L) 235 return ((invsqrtpi * ss) / sqrtl(x)); 236 237 return (invsqrtpi * (pzero(x) * ss + qzero(x) * cc) / sqrtl(x)); 238 } 239 240 if (x <= tiny) 241 return (u0[0] + tpi * logl(x)); 242 243 z = x * x; 244 u = u0[7]; 245 v = v0[7]; 246 247 for (i = 6; i >= 0; i--) { 248 u = u * z + u0[i]; 249 v = v * z + v0[i]; 250 } 251 252 return (u / v + tpi * (j0l(x) * logl(x))); 253 } 254 255 static GENERIC pr0[12] = { /* [16 -- inf] */ 256 9.999999999999999999999999999999999997515e-0001L, 257 1.065981615377273376425365823967550598358e+0003L, 258 4.390991200927588978306374718984240719130e+0005L, 259 9.072086218607986711847069407339321363103e+0007L, 260 1.022552886177375367408408501046461671528e+0010L, 261 6.420766912243658241570635854089597269031e+0011L, 262 2.206451725126933913591080211081242266908e+0013L, 263 3.928369596816895077363705478743346298368e+0014L, 264 3.258159928874124597286701119721482876596e+0015L, 265 1.025715808134188978860679130140685101348e+0016L, 266 7.537170874795721255796001687024031280685e+0015L, 267 -1.579413901450157332307745586004207687796e+0014L, 268 }; 269 270 static GENERIC ps0[11] = { 271 1.0e0L, 272 1.066051927877273376425365823967550512687e+0003L, 273 4.391739647168381592399173804329266353038e+0005L, 274 9.075162261801343671805658294123888867884e+0007L, 275 1.023186118519904751819581912075985995058e+0010L, 276 6.427861860414223746340515376512730275061e+0011L, 277 2.210861503237823589735481303627993406235e+0013L, 278 3.943247335784292905915956840901818177989e+0014L, 279 3.283720976777545142150200110647270004481e+0015L, 280 1.045346918812754048903645641538728986759e+0016L, 281 8.043455468065618900750599584291193680463e+0015L, 282 }; 283 284 static GENERIC pr1[12] = { /* [8 -- 16] */ 285 9.999999999999999999999784422701108683618e-0001L, 286 6.796098532948334207755488692777907062894e+0002L, 287 1.840036112605722168824530758797169836042e+0005L, 288 2.598490483191916637264894340635847598122e+0007L, 289 2.105774863242707025525730249472054578523e+0009L, 290 1.015822044230542426666314997796944979959e+0011L, 291 2.931557457008110436764077699944189071875e+0012L, 292 4.962885121125457633655259224179322808824e+0013L, 293 4.705424055148223269155430598563351566279e+0014L, 294 2.294439854910747229152056080910427001110e+0015L, 295 4.905531843137486691500950019322475458629e+0015L, 296 3.187543169710339218793442542845735994565e+0015L, 297 }; 298 299 static GENERIC ps1[14] = { 300 1.0e0L, 301 6.796801657948334207754571576066758180288e+0002L, 302 1.840512891201300567325421059826676366447e+0005L, 303 2.599777028312918975306252167127695075221e+0007L, 304 2.107582572771047636846811284634244892537e+0009L, 305 1.017275794694156108975782763889979940348e+0011L, 306 2.938487645192463845428059755454762316011e+0012L, 307 4.982512164735557054521042916182317924466e+0013L, 308 4.737639900153703274792677468264564361437e+0014L, 309 2.323398719123742743524249528275097100646e+0015L, 310 5.033419107069210577868909797896984419391e+0015L, 311 3.409036105931068609601317076759804716059e+0015L, 312 7.505655364352679737585745147753521662166e+0013L, 313 -9.976837153983688250780198248297109118313e+0012L, 314 }; 315 316 static GENERIC pr2[12] = { /* [5 -- 8 ] */ 317 9.999999999999999937857236789277366320220e-0001L, 318 3.692848765268649571651602420376358849214e+0002L, 319 5.373022067535476576926715900057760985410e+0004L, 320 4.038738891191314969971504035057219430725e+0006L, 321 1.728285706306940523397385566659762646999e+0008L, 322 4.375400819645889911158688737206054788534e+0009L, 323 6.598950418204912408375591217782088567076e+0010L, 324 5.827182039183238492480275401520072793783e+0011L, 325 2.884222642913492390887572414999490975844e+0012L, 326 7.373278873797767721932837830628688632775e+0012L, 327 8.338295457568973761205077964397969230489e+0012L, 328 2.911383183467288345772308817209806922143e+0012L, 329 }; 330 331 static GENERIC ps2[14] = { 332 1.0e0L, 333 3.693551890268649477288896267171993213102e+0002L, 334 5.375607880998361502474715133828068514297e+0004L, 335 4.042477764024108249744998862572786367328e+0006L, 336 1.731069838737016956685839588670132939513e+0008L, 337 4.387147674049898778738226585935491417728e+0009L, 338 6.628058659620653765349556940567715258165e+0010L, 339 5.869659904164177740471685856367322160664e+0011L, 340 2.919839445622817017058977559638969436383e+0012L, 341 7.535314897696671402628203718612309253907e+0012L, 342 8.696355561452933775773309859748610658935e+0012L, 343 3.216155103141537221173601557697083216257e+0012L, 344 4.756857081068942248246880159213789086363e+0010L, 345 -3.496356619666608032231074866481472824067e+0009L, 346 }; 347 348 static GENERIC pr3[13] = { /* [3.5 -- 5 ] */ 349 9.999999999999916693107285612398196588247e-0001L, 350 2.263975921282917721194425320484974336945e+0002L, 351 1.994358386744245848889492762781484199966e+0004L, 352 8.980067458430542243559962493831661323168e+0005L, 353 2.282213787521372663705567756420087553508e+0007L, 354 3.409784374889063618250288699908375135923e+0008L, 355 3.024380857401448589254343517589811711108e+0009L, 356 1.571110368046740246895071721443082286379e+0010L, 357 4.603187020243604632153685300463160593768e+0010L, 358 7.087196453409712719449549280664058793403e+0010L, 359 5.046196021776346356803687409644239065041e+0010L, 360 1.287758439080165765709154276618854799932e+0010L, 361 5.900679773415023433787846658096813590784e+0008L, 362 }; 363 364 static GENERIC ps3[13] = { 365 1.0e0L, 366 2.264679046282855061328604619231774747116e+0002L, 367 1.995939523988944553755653255389812103448e+0004L, 368 8.993853144706348727038389967490183236820e+0005L, 369 2.288326099634588843906989983704795468773e+0007L, 370 3.424967100255240885169240956804790118282e+0008L, 371 3.046311797972463991368023759640028910016e+0009L, 372 1.589614961932826812790222479700797224003e+0010L, 373 4.692406624527744816497089139325073939927e+0010L, 374 7.320486495902008912866462849073108323948e+0010L, 375 5.345945972828978289935309597742981360994e+0010L, 376 1.444033091910423754121309915092247171008e+0010L, 377 7.987714685115314668378957273824383610525e+0008L, 378 }; 379 380 static GENERIC pr4[13] = { /* [2.5, 3.5] */ 381 9.999999999986736677961118722747757712260e-0001L, 382 1.453824980703800559037873123568378845663e+0002L, 383 8.097327216430682288267610447006508661032e+0003L, 384 2.273847252038264370231169686380192662135e+0005L, 385 3.561056728046211111354759998976985449622e+0006L, 386 3.244933588800096378434627029369680378599e+0007L, 387 1.740112392860717950376210038908476792588e+0008L, 388 5.426170187455893285197878563881579269524e+0008L, 389 9.490107486454362321004377336020526281371e+0008L, 390 8.688872439428470049801714121070005313806e+0008L, 391 3.673315853166437222811910656900123215515e+0008L, 392 5.577770470359303305164877446339693270239e+0007L, 393 1.540438642031689641308197880181291865714e+0006L, 394 }; 395 396 static GENERIC ps4[13] = { /* [2.5, 3.5] */ 397 1.0e0L, 398 1.454528105698159439773035951959131799816e+0002L, 399 8.107442215200392397172179900434987859618e+0003L, 400 2.279390393778242887574177096606328994140e+0005L, 401 3.576251625592252008424781111770934135844e+0006L, 402 3.267909499056932631405942058670933813863e+0007L, 403 1.760021515330805537499778238099704648805e+0008L, 404 5.525553787667353981242060222587465726729e+0008L, 405 9.769870295912820457889384082671269328511e+0008L, 406 9.110582071004774279226905629624018008454e+0008L, 407 3.981857678621955599371967680343918454345e+0008L, 408 6.482404686230769399073192961667697036706e+0007L, 409 2.210046943095878402443535460329391782298e+0006L, 410 }; 411 412 static GENERIC pr5[13] = { /* [1.777..., 2.5] */ 413 9.999999999114986107951817871144655880699e-0001L, 414 9.252583736048588342568344570315435947614e+0001L, 415 3.218726757856078715214631502407386264637e+0003L, 416 5.554009964621111656479588505862577040831e+0004L, 417 5.269993115643664338253196944523510290175e+0005L, 418 2.874613773778430691192912190618220544575e+0006L, 419 9.133538151103658353874146919613442436035e+0006L, 420 1.673067041410338922825193013077354249193e+0007L, 421 1.706913873848398011744790289200151840498e+0007L, 422 9.067766583853288534551600235576747618679e+0006L, 423 2.216746733457884568532695355036338655872e+0006L, 424 1.945753880802872541235703812722344514405e+0005L, 425 3.132374412921948071539195638885330951749e+0003L, 426 }; 427 428 static GENERIC ps5[13] = { /* [1.777..., 2.5] */ 429 1.0e0L, 430 9.259614983862181118883831670990340052982e+0001L, 431 3.225125275462903384842124075132609290304e+0003L, 432 5.575705362829101545292760055941855246492e+0004L, 433 5.306049863037087855496170121958448492522e+0005L, 434 2.907060758873509564309729903109018597215e+0006L, 435 9.298059206584995898298257827131208539289e+0006L, 436 1.720391071006963176836108026556547062980e+0007L, 437 1.782614812922865190479394509487941920612e+0007L, 438 9.708016389605273153536452032839879950155e+0006L, 439 2.476495084688170096480215640962175140027e+0006L, 440 2.363200660365585759668077790194604917187e+0005L, 441 4.803239569848196077121203575704356936731e+0003L, 442 }; 443 444 static GENERIC pr6[13] = { /* [1.28, 1.777...] */ 445 9.999999969777095495998606925524322559556e-0001L, 446 5.825486719466194430503283824096872219216e+0001L, 447 1.248155491637757281915184824965379905380e+0003L, 448 1.302093199842358609321338417071710477615e+0004L, 449 7.353835804186292782840961999810543016039e+0004L, 450 2.356471661113686180549195092555751341757e+0005L, 451 4.350553267429009581632987060942780847101e+0005L, 452 4.588762661876600638719159826652389418235e+0005L, 453 2.675796398548523436544221045225290128611e+0005L, 454 8.077649557108971388298292919988449940464e+0004L, 455 1.117640459221306873519068741664054573776e+0004L, 456 5.544400072396814695175787511557757885585e+0002L, 457 5.072550541191480498431289089905822910718e+0000L, 458 }; 459 460 static GENERIC ps6[13] = { /* [1.28, 1.777...] */ 461 1.0e0L, 462 5.832517925357165050639075848183613063291e+0001L, 463 1.252144364743592128171256104364976466898e+0003L, 464 1.310300234342216813579118022415585740772e+0004L, 465 7.434667697093812197817292154032863632923e+0004L, 466 2.398706595587719165726469002404004614711e+0005L, 467 4.472737517625103157004869372427480602511e+0005L, 468 4.786313523337761975294171429067037723611e+0005L, 469 2.851161872872731228472536061865365370192e+0005L, 470 8.891648269899148412331918021801385815586e+0004L, 471 1.297097489535351517572978123584751042287e+0004L, 472 7.096761640545975756202184143400469812618e+0002L, 473 8.378049338590233325977702401733340820351e+0000L, 474 }; 475 476 static GENERIC sixteen = 16.0L; 477 static GENERIC huge = 1.0e30L; 478 479 static GENERIC 480 pzero(x) 481 GENERIC x; 482 { 483 GENERIC s, r, t, z; 484 int i; 485 486 if (x > huge) 487 return (one); 488 489 t = one / x; 490 z = t * t; 491 492 if (x > sixteen) { 493 r = z * pr0[11] + pr0[10]; 494 s = ps0[10]; 495 496 for (i = 9; i >= 0; i--) { 497 r = z * r + pr0[i]; 498 s = z * s + ps0[i]; 499 } 500 } else if (x > eight) { 501 r = pr1[11]; 502 s = ps1[11] + z * (ps1[12] + z * ps1[13]); 503 504 for (i = 10; i >= 0; i--) { 505 r = z * r + pr1[i]; 506 s = z * s + ps1[i]; 507 } 508 } else if (x > five) { /* x > 5.0 */ 509 r = pr2[11]; 510 s = ps2[11] + z * (ps2[12] + z * ps2[13]); 511 512 for (i = 10; i >= 0; i--) { 513 r = z * r + pr2[i]; 514 s = z * s + ps2[i]; 515 } 516 } else if (x > 3.5L) { 517 r = pr3[12]; 518 s = ps3[12]; 519 520 for (i = 11; i >= 0; i--) { 521 r = z * r + pr3[i]; 522 s = z * s + ps3[i]; 523 } 524 } else if (x > 2.5L) { 525 r = pr4[12]; 526 s = ps4[12]; 527 528 for (i = 11; i >= 0; i--) { 529 r = z * r + pr4[i]; 530 s = z * s + ps4[i]; 531 } 532 } else if (x > (1.0L / 0.5625L)) { 533 r = pr5[12]; 534 s = ps5[12]; 535 536 for (i = 11; i >= 0; i--) { 537 r = z * r + pr5[i]; 538 s = z * s + ps5[i]; 539 } 540 } else { /* assume x > 1.28 */ 541 r = pr6[12]; 542 s = ps6[12]; 543 544 for (i = 11; i >= 0; i--) { 545 r = z * r + pr6[i]; 546 s = z * s + ps6[i]; 547 } 548 } 549 550 return (r / s); 551 } 552 static GENERIC qr0[12] = { /* [16, inf] */ 553 -1.249999999999999999999999999999999972972e-0001L, 554 -1.425179595545670577414395762503991596897e+0002L, 555 -6.312499645625970845534460257936222407219e+0004L, 556 -1.411374326457208384315121243698814446848e+0007L, 557 -1.735034212758873581410984757860787252842e+0009L, 558 -1.199777647512789489421826342485055280680e+0011L, 559 -4.596025334081655714499860409699100373644e+0012L, 560 -9.262525628201284107792924477031653399187e+0013L, 561 -8.858394728685039245344398842180662867639e+0014L, 562 -3.267527953687534887623740622709505972113e+0015L, 563 -2.664222971186311967587129347029450062019e+0015L, 564 3.442464060723987869585180095344504100204e+0014L, 565 }; 566 567 static GENERIC qs0[11] = { 568 1.0e0L, 569 1.140729613936536461931516610003185687881e+0003L, 570 5.056665510442299351009198186490085803580e+0005L, 571 1.132041763825642787943941650522718199115e+0008L, 572 1.394570111872581606392620678214246479767e+0010L, 573 9.677945218152264789534431079563744378421e+0011L, 574 3.731140327851536828225143058896348502096e+0013L, 575 7.612785951064869291722846681020881676410e+0014L, 576 7.476077016406764891730191004811863975940e+0015L, 577 2.951246482613592035421503427100393831709e+0016L, 578 3.108361803691811711136854587074302034901e+0016L, 579 }; 580 581 static GENERIC qr1[12] = { /* [8, 16 ] */ 582 -1.249999999999999999997949010383433818157e-0001L, 583 -9.051215166393822640636752244895124126934e+0001L, 584 -2.620782703428148837671179031904208303947e+0004L, 585 -3.975571261553504457766177974508785790884e+0006L, 586 -3.479029330759311306270072218074074994090e+0008L, 587 -1.823955008124268573036216746186239829089e+0010L, 588 -5.765932697111801375765156029221568664435e+0011L, 589 -1.079843680798742592954002192417934779114e+0013L, 590 -1.146893630504592739082205764611581332897e+0014L, 591 -6.367016059683898464936104447282880704182e+0014L, 592 -1.583109041961213490464459111903484209098e+0015L, 593 -1.230149555764242473103128650135795639412e+0015L, 594 }; 595 596 static GENERIC qs1[14] = { 597 1.0e0L, 598 7.246831508115058112438579847778014458432e+0002L, 599 2.100854184439168518399383786306927037611e+0005L, 600 3.192636418837951507430188285940994235122e+0007L, 601 2.801558443383354674538443461124434216152e+0009L, 602 1.475026997664373739293483927250653467487e+0011L, 603 4.694486824913954608552363821799927145318e+0012L, 604 8.890350100919200250838438709601547334021e+0013L, 605 9.626844429082905144874701068760469752067e+0014L, 606 5.541110744600460773528263862687521642140e+0015L, 607 1.486500494789452556727470329232123096563e+0016L, 608 1.415840104845959400365430773732093899210e+0016L, 609 1.780866095241517418081312567239682336483e+0015L, 610 -2.359230917384889357887631544079990129494e+0014L, 611 }; 612 613 static GENERIC qr2[12] = { /* [5, 8] */ 614 -1.249999999999999531937744362527772181614e-0001L, 615 -4.944373897356969774839375977239241573966e+0001L, 616 -7.728449175433465285314261650078450473909e+0003L, 617 -6.262574329612752346336901434651220705903e+0005L, 618 -2.900948220220943306027235217424380672732e+0007L, 619 -7.988719647634192770463917157562874119535e+0008L, 620 -1.318228171927181389547760026626357012375e+0010L, 621 -1.282439773983029245309263271945424928196e+0011L, 622 -7.050925570827818040186149940257918845138e+0011L, 623 -2.021751882573871990004205616874202684429e+0012L, 624 -2.592939962400668552384333900573812635658e+0012L, 625 -1.038267109518891262840601514932972850326e+0012L, 626 }; 627 628 static GENERIC qs2[14] = { 629 1.0e0L, 630 3.961358492885570003202784022894248952116e+0002L, 631 6.205788738864701882828752634586510926968e+0004L, 632 5.045715603932670286550673813011764406749e+0006L, 633 2.349248611362658323353343389430968751429e+0008L, 634 6.520244524415828635917683553721880063911e+0009L, 635 1.089111211223507719337067159886281887722e+0011L, 636 1.080406000905359867958779409414903018610e+0012L, 637 6.135645280895514703514154680623769562148e+0012L, 638 1.862433040246625874245867151368643668215e+0013L, 639 2.667780805786648888840777888702193708994e+0013L, 640 1.394401107289087774765300711809313112824e+0013L, 641 1.093247500616320375562898297156722445484e+0012L, 642 -7.228875530378928722826604216491493780775e+0010L, 643 }; 644 645 static GENERIC qr3[13] = { /* [3.5 5] */ 646 -1.249999999999473067748420379578481661075e-0001L, 647 -3.044549048635289351913574324803250977998e+0001L, 648 -2.890081140649769078496693003524681440869e+0003L, 649 -1.404922456817202235879343275330529107684e+0005L, 650 -3.862746614385573443518177403617349281869e+0006L, 651 -6.257517309110249049201133708911155047689e+0007L, 652 -6.031451330920839916987079782727323477520e+0008L, 653 -3.411542405173830611454025765755854382346e+0009L, 654 -1.089392478149726672133014498723021526099e+0010L, 655 -1.824934078420210941290140903415956782726e+0010L, 656 -1.400780278304358710423481070486939531139e+0010L, 657 -3.716484136064917363926635716743771092093e+0009L, 658 -1.397591075296425529970434890954904331580e+0008L, 659 }; 660 661 static GENERIC qs3[13] = { 662 1.0e0L, 663 2.441498613904962049391000187014945858042e+0002L, 664 2.326188882072370711500164222341514337043e+0004L, 665 1.137138213121231338494977104659239578165e+0006L, 666 3.152918070735662728722998452605364253517e+0007L, 667 5.172877993426507259314270488444013595108e+0008L, 668 5.083086439731669807455961078856470774115e+0009L, 669 2.961842732066434123119325521139476909941e+0010L, 670 9.912185866862440735829781856081353151390e+0010L, 671 1.793560561251622234430564181567297983598e+0011L, 672 1.577090119341228122525265108497940403073e+0011L, 673 5.509910306780166194333889999985463681636e+0010L, 674 4.761691134078874491202320181517936758141e+0009L, 675 }; 676 677 static GENERIC qr4[13] = { /* [2.5 3.5] */ 678 -1.249999999928567734339745043490705340835e-0001L, 679 -1.967201748731419063051601624435565528481e+0001L, 680 -1.186329146714562236407099740615528170707e+0003L, 681 -3.607736959222941810356301491152457934060e+0004L, 682 -6.119200717978104904932828468575194267125e+0005L, 683 -6.037847781158358226670305078652205586384e+0006L, 684 -3.503558153336140359700536720393565984740e+0007L, 685 -1.180196478268225718757218523746787309773e+0008L, 686 -2.221860232085134915841426363505169680528e+0008L, 687 -2.173372505452747585296176761701746236760e+0008L, 688 -9.649364865061237558517730539506568013963e+0007L, 689 -1.465429227847933034546039640094862650385e+0007L, 690 -3.083003197920262085170581866246663380607e+0005L, 691 }; 692 693 static GENERIC qs4[13] = { /* [2.5 3.5] */ 694 1.0e0L, 695 1.579620773732259142752614142139986854055e+0002L, 696 9.581372220329138733203879503753685054968e+0003L, 697 2.939598672379108095776114131010825885308e+0005L, 698 5.052183049314542218630341818692588448168e+0006L, 699 5.083497695595206639433839326338971980149e+0007L, 700 3.036385361800553388049719014005099206516e+0008L, 701 1.067826481452753409910563785161661492137e+0009L, 702 2.145644125557118044720741775125319669272e+0009L, 703 2.324115615959719949363946673491552216799e+0009L, 704 1.223262962112070757966959855619847011146e+0009L, 705 2.569765553318495423738478585947110270709e+0008L, 706 1.354744744299227127897905787732636565504e+0007L, 707 }; 708 709 static GENERIC qr5[13] = { /* [1.777.., 2.5] */ 710 -1.249999995936639697637680428174576069971e-0001L, 711 -1.260846055371311453485891923426489068315e+0001L, 712 -4.772398467544467480801174330290141578895e+0002L, 713 -8.939852599990298486613760833996490599724e+0003L, 714 -9.184070787149542050979542226446134243197e+0004L, 715 -5.406038945018274458362637897739280435171e+0005L, 716 -1.845896544705190261018653728678171084418e+0006L, 717 -3.613616990680809501878667570653308071547e+0006L, 718 -3.908782978135693252252557720414348623779e+0006L, 719 -2.173711022517323927109138170588442768176e+0006L, 720 -5.431253130679918485836408549007856244495e+0005L, 721 -4.591098546452684510082591587275940765959e+0004L, 722 -5.244711364168207806835520057792229646578e+0002L, 723 }; 724 725 static GENERIC qs5[13] = { /* [1.777.., 2.5] */ 726 1.0e0L, 727 1.014536210851290878350892750972474861447e+0002L, 728 3.875547510687135314064434160096139681076e+0003L, 729 7.361913122670079814955259281995617732580e+0004L, 730 7.720288944218771126581086539585529314636e+0005L, 731 4.681529554446752496404431433608306558038e+0006L, 732 1.667882621940503925455031252308367745820e+0007L, 733 3.469403153761399881888272620855305156241e+0007L, 734 4.096992047964210711867089384719947863019e+0007L, 735 2.596804755829217449311530735959560630554e+0007L, 736 7.983933774697889238154465064019410763845e+0006L, 737 9.818133816979900819087242425280757938152e+0005L, 738 3.061083930868694396013541535670745443560e+0004L, 739 }; 740 741 static GENERIC qr6[13] = { /* [1.28, 1.777..] */ 742 -1.249999881577289001807137282824929082771e-0001L, 743 -7.998273510053110759610810594119533619282e+0000L, 744 -1.872481955335172543369089617771565632719e+0002L, 745 -2.122116786726300805079874003303799646812e+0003L, 746 -1.293850285839529282503178263484773478457e+0004L, 747 -4.445024742266316181033354192262529356093e+0004L, 748 -8.730161378334357767668344467356505347070e+0004L, 749 -9.706222895172078442801444972505315054736e+0004L, 750 -5.896325518259858270165531513618195321041e+0004L, 751 -1.823172034368108822276420827074668832233e+0004L, 752 -2.509304178635055926638833040337472387175e+0003L, 753 -1.156608965715779237316769828941729964099e+0002L, 754 -7.028005789650731396887346826397785210442e-0001L, 755 }; 756 757 static GENERIC qs6[13] = { /* [1.28, 1.777..] */ 758 1.0e0L, 759 6.457211085058064845601261321277721075900e+0001L, 760 1.534005216588011210342824555136008682950e+0003L, 761 1.777217999176441782593357660462379097171e+0004L, 762 1.118372652642469468091084810263231199696e+0005L, 763 4.015242433858461813142365748386473605294e+0005L, 764 8.377081045517098645448616514388280497673e+0005L, 765 1.011495020008010352575398009604164287337e+0006L, 766 6.886722075290430568652227875200208955970e+0005L, 767 2.504735189948021472047157148613171956537e+0005L, 768 4.408138920171044846941001844352009817062e+0004L, 769 3.105572178072115145673058722853640854884e+0003L, 770 5.588294821118916113437396504573817033678e+0001L, 771 }; 772 773 static GENERIC 774 qzero(x) 775 GENERIC x; 776 { 777 GENERIC s, r, t, z; 778 int i; 779 780 if (x > huge) 781 return (-0.125L / x); 782 783 t = one / x; 784 z = t * t; 785 786 if (x > sixteen) { 787 r = z * qr0[11] + qr0[10]; 788 s = qs0[10]; 789 790 for (i = 9; i >= 0; i--) { 791 r = z * r + qr0[i]; 792 s = z * s + qs0[i]; 793 } 794 } else if (x > eight) { 795 r = qr1[11]; 796 s = qs1[11] + z * (qs1[12] + z * qs1[13]); 797 798 for (i = 10; i >= 0; i--) { 799 r = z * r + qr1[i]; 800 s = z * s + qs1[i]; 801 } 802 } else if (x > five) { /* assume x > 5.0 */ 803 r = qr2[11]; 804 s = qs2[11] + z * (qs2[12] + z * qs2[13]); 805 806 for (i = 10; i >= 0; i--) { 807 r = z * r + qr2[i]; 808 s = z * s + qs2[i]; 809 } 810 } else if (x > 3.5L) { 811 r = qr3[12]; 812 s = qs3[12]; 813 814 for (i = 11; i >= 0; i--) { 815 r = z * r + qr3[i]; 816 s = z * s + qs3[i]; 817 } 818 } else if (x > 2.5L) { 819 r = qr4[12]; 820 s = qs4[12]; 821 822 for (i = 11; i >= 0; i--) { 823 r = z * r + qr4[i]; 824 s = z * s + qs4[i]; 825 } 826 } else if (x > (1.0L / 0.5625L)) { 827 r = qr5[12]; 828 s = qs5[12]; 829 830 for (i = 11; i >= 0; i--) { 831 r = z * r + qr5[i]; 832 s = z * s + qs5[i]; 833 } 834 } else { /* assume x > 1.28 */ 835 r = qr6[12]; 836 s = qs6[12]; 837 838 for (i = 11; i >= 0; i--) { 839 r = z * r + qr6[i]; 840 s = z * s + qs6[i]; 841 } 842 } 843 844 return (t * (r / s)); 845 }