1 1.1 mrg /* j1l.c 2 1.1 mrg * 3 1.1 mrg * Bessel function of order one 4 1.1 mrg * 5 1.1 mrg * 6 1.1 mrg * 7 1.1 mrg * SYNOPSIS: 8 1.1 mrg * 9 1.1 mrg * long double x, y, j1l(); 10 1.1 mrg * 11 1.1 mrg * y = j1l( x ); 12 1.1 mrg * 13 1.1 mrg * 14 1.1 mrg * 15 1.1 mrg * DESCRIPTION: 16 1.1 mrg * 17 1.1 mrg * Returns Bessel function of first kind, order one of the argument. 18 1.1 mrg * 19 1.1 mrg * The domain is divided into two major intervals [0, 2] and 20 1.1 mrg * (2, infinity). In the first interval the rational approximation is 21 1.1 mrg * J1(x) = .5x + x x^2 R(x^2) 22 1.1 mrg * 23 1.1 mrg * The second interval is further partitioned into eight equal segments 24 1.1 mrg * of 1/x. 25 1.1 mrg * J1(x) = sqrt(2/(pi x)) (P1(x) cos(X) - Q1(x) sin(X)), 26 1.1 mrg * X = x - 3 pi / 4, 27 1.1 mrg * 28 1.1 mrg * and the auxiliary functions are given by 29 1.1 mrg * 30 1.1 mrg * J1(x)cos(X) + Y1(x)sin(X) = sqrt( 2/(pi x)) P1(x), 31 1.1 mrg * P1(x) = 1 + 1/x^2 R(1/x^2) 32 1.1 mrg * 33 1.1 mrg * Y1(x)cos(X) - J1(x)sin(X) = sqrt( 2/(pi x)) Q1(x), 34 1.1 mrg * Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)). 35 1.1 mrg * 36 1.1 mrg * 37 1.1 mrg * 38 1.1 mrg * ACCURACY: 39 1.1 mrg * 40 1.1 mrg * Absolute error: 41 1.1 mrg * arithmetic domain # trials peak rms 42 1.1 mrg * IEEE 0, 30 100000 2.8e-34 2.7e-35 43 1.1 mrg * 44 1.1 mrg * 45 1.1 mrg */ 46 1.1 mrg 47 1.1 mrg /* y1l.c 48 1.1 mrg * 49 1.1 mrg * Bessel function of the second kind, order one 50 1.1 mrg * 51 1.1 mrg * 52 1.1 mrg * 53 1.1 mrg * SYNOPSIS: 54 1.1 mrg * 55 1.1 mrg * double x, y, y1l(); 56 1.1 mrg * 57 1.1 mrg * y = y1l( x ); 58 1.1 mrg * 59 1.1 mrg * 60 1.1 mrg * 61 1.1 mrg * DESCRIPTION: 62 1.1 mrg * 63 1.1 mrg * Returns Bessel function of the second kind, of order 64 1.1 mrg * one, of the argument. 65 1.1 mrg * 66 1.1 mrg * The domain is divided into two major intervals [0, 2] and 67 1.1 mrg * (2, infinity). In the first interval the rational approximation is 68 1.1 mrg * Y1(x) = 2/pi * (log(x) * J1(x) - 1/x) + x R(x^2) . 69 1.1 mrg * In the second interval the approximation is the same as for J1(x), and 70 1.1 mrg * Y1(x) = sqrt(2/(pi x)) (P1(x) sin(X) + Q1(x) cos(X)), 71 1.1 mrg * X = x - 3 pi / 4. 72 1.1 mrg * 73 1.1 mrg * ACCURACY: 74 1.1 mrg * 75 1.1 mrg * Absolute error, when y0(x) < 1; else relative error: 76 1.1 mrg * 77 1.1 mrg * arithmetic domain # trials peak rms 78 1.1 mrg * IEEE 0, 30 100000 2.7e-34 2.9e-35 79 1.1 mrg * 80 1.1 mrg */ 81 1.1 mrg 82 1.1 mrg /* Copyright 2001 by Stephen L. Moshier (moshier (at) na-net.onrl.gov). 83 1.1 mrg 84 1.1 mrg This library is free software; you can redistribute it and/or 85 1.1 mrg modify it under the terms of the GNU Lesser General Public 86 1.1 mrg License as published by the Free Software Foundation; either 87 1.1 mrg version 2.1 of the License, or (at your option) any later version. 88 1.1 mrg 89 1.1 mrg This library is distributed in the hope that it will be useful, 90 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 91 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 92 1.1 mrg Lesser General Public License for more details. 93 1.1 mrg 94 1.1 mrg You should have received a copy of the GNU Lesser General Public 95 1.1 mrg License along with this library; if not, see 96 1.1 mrg <http://www.gnu.org/licenses/>. */ 97 1.1 mrg 98 1.1 mrg #include "quadmath-imp.h" 99 1.1 mrg 100 1.1 mrg /* 1 / sqrt(pi) */ 101 1.1 mrg static const __float128 ONEOSQPI = 5.6418958354775628694807945156077258584405E-1Q; 102 1.1 mrg /* 2 / pi */ 103 1.1 mrg static const __float128 TWOOPI = 6.3661977236758134307553505349005744813784E-1Q; 104 1.1 mrg static const __float128 zero = 0; 105 1.1 mrg 106 1.1 mrg /* J1(x) = .5x + x x^2 R(x^2) 107 1.1 mrg Peak relative error 1.9e-35 108 1.1 mrg 0 <= x <= 2 */ 109 1.1 mrg #define NJ0_2N 6 110 1.1 mrg static const __float128 J0_2N[NJ0_2N + 1] = { 111 1.1 mrg -5.943799577386942855938508697619735179660E16Q, 112 1.1 mrg 1.812087021305009192259946997014044074711E15Q, 113 1.1 mrg -2.761698314264509665075127515729146460895E13Q, 114 1.1 mrg 2.091089497823600978949389109350658815972E11Q, 115 1.1 mrg -8.546413231387036372945453565654130054307E8Q, 116 1.1 mrg 1.797229225249742247475464052741320612261E6Q, 117 1.1 mrg -1.559552840946694171346552770008812083969E3Q 118 1.1 mrg }; 119 1.1 mrg #define NJ0_2D 6 120 1.1 mrg static const __float128 J0_2D[NJ0_2D + 1] = { 121 1.1 mrg 9.510079323819108569501613916191477479397E17Q, 122 1.1 mrg 1.063193817503280529676423936545854693915E16Q, 123 1.1 mrg 5.934143516050192600795972192791775226920E13Q, 124 1.1 mrg 2.168000911950620999091479265214368352883E11Q, 125 1.1 mrg 5.673775894803172808323058205986256928794E8Q, 126 1.1 mrg 1.080329960080981204840966206372671147224E6Q, 127 1.1 mrg 1.411951256636576283942477881535283304912E3Q, 128 1.1 mrg /* 1.000000000000000000000000000000000000000E0L */ 129 1.1 mrg }; 130 1.1 mrg 131 1.1 mrg /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2), 132 1.1 mrg 0 <= 1/x <= .0625 133 1.1 mrg Peak relative error 3.6e-36 */ 134 1.1 mrg #define NP16_IN 9 135 1.1 mrg static const __float128 P16_IN[NP16_IN + 1] = { 136 1.1 mrg 5.143674369359646114999545149085139822905E-16Q, 137 1.1 mrg 4.836645664124562546056389268546233577376E-13Q, 138 1.1 mrg 1.730945562285804805325011561498453013673E-10Q, 139 1.1 mrg 3.047976856147077889834905908605310585810E-8Q, 140 1.1 mrg 2.855227609107969710407464739188141162386E-6Q, 141 1.1 mrg 1.439362407936705484122143713643023998457E-4Q, 142 1.1 mrg 3.774489768532936551500999699815873422073E-3Q, 143 1.1 mrg 4.723962172984642566142399678920790598426E-2Q, 144 1.1 mrg 2.359289678988743939925017240478818248735E-1Q, 145 1.1 mrg 3.032580002220628812728954785118117124520E-1Q, 146 1.1 mrg }; 147 1.1 mrg #define NP16_ID 9 148 1.1 mrg static const __float128 P16_ID[NP16_ID + 1] = { 149 1.1 mrg 4.389268795186898018132945193912677177553E-15Q, 150 1.1 mrg 4.132671824807454334388868363256830961655E-12Q, 151 1.1 mrg 1.482133328179508835835963635130894413136E-9Q, 152 1.1 mrg 2.618941412861122118906353737117067376236E-7Q, 153 1.1 mrg 2.467854246740858470815714426201888034270E-5Q, 154 1.1 mrg 1.257192927368839847825938545925340230490E-3Q, 155 1.1 mrg 3.362739031941574274949719324644120720341E-2Q, 156 1.1 mrg 4.384458231338934105875343439265370178858E-1Q, 157 1.1 mrg 2.412830809841095249170909628197264854651E0Q, 158 1.1 mrg 4.176078204111348059102962617368214856874E0Q, 159 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 160 1.1 mrg }; 161 1.1 mrg 162 1.1 mrg /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2), 163 1.1 mrg 0.0625 <= 1/x <= 0.125 164 1.1 mrg Peak relative error 1.9e-36 */ 165 1.1 mrg #define NP8_16N 11 166 1.1 mrg static const __float128 P8_16N[NP8_16N + 1] = { 167 1.1 mrg 2.984612480763362345647303274082071598135E-16Q, 168 1.1 mrg 1.923651877544126103941232173085475682334E-13Q, 169 1.1 mrg 4.881258879388869396043760693256024307743E-11Q, 170 1.1 mrg 6.368866572475045408480898921866869811889E-9Q, 171 1.1 mrg 4.684818344104910450523906967821090796737E-7Q, 172 1.1 mrg 2.005177298271593587095982211091300382796E-5Q, 173 1.1 mrg 4.979808067163957634120681477207147536182E-4Q, 174 1.1 mrg 6.946005761642579085284689047091173581127E-3Q, 175 1.1 mrg 5.074601112955765012750207555985299026204E-2Q, 176 1.1 mrg 1.698599455896180893191766195194231825379E-1Q, 177 1.1 mrg 1.957536905259237627737222775573623779638E-1Q, 178 1.1 mrg 2.991314703282528370270179989044994319374E-2Q, 179 1.1 mrg }; 180 1.1 mrg #define NP8_16D 10 181 1.1 mrg static const __float128 P8_16D[NP8_16D + 1] = { 182 1.1 mrg 2.546869316918069202079580939942463010937E-15Q, 183 1.1 mrg 1.644650111942455804019788382157745229955E-12Q, 184 1.1 mrg 4.185430770291694079925607420808011147173E-10Q, 185 1.1 mrg 5.485331966975218025368698195861074143153E-8Q, 186 1.1 mrg 4.062884421686912042335466327098932678905E-6Q, 187 1.1 mrg 1.758139661060905948870523641319556816772E-4Q, 188 1.1 mrg 4.445143889306356207566032244985607493096E-3Q, 189 1.1 mrg 6.391901016293512632765621532571159071158E-2Q, 190 1.1 mrg 4.933040207519900471177016015718145795434E-1Q, 191 1.1 mrg 1.839144086168947712971630337250761842976E0Q, 192 1.1 mrg 2.715120873995490920415616716916149586579E0Q, 193 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 194 1.1 mrg }; 195 1.1 mrg 196 1.1 mrg /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2), 197 1.1 mrg 0.125 <= 1/x <= 0.1875 198 1.1 mrg Peak relative error 1.3e-36 */ 199 1.1 mrg #define NP5_8N 10 200 1.1 mrg static const __float128 P5_8N[NP5_8N + 1] = { 201 1.1 mrg 2.837678373978003452653763806968237227234E-12Q, 202 1.1 mrg 9.726641165590364928442128579282742354806E-10Q, 203 1.1 mrg 1.284408003604131382028112171490633956539E-7Q, 204 1.1 mrg 8.524624695868291291250573339272194285008E-6Q, 205 1.1 mrg 3.111516908953172249853673787748841282846E-4Q, 206 1.1 mrg 6.423175156126364104172801983096596409176E-3Q, 207 1.1 mrg 7.430220589989104581004416356260692450652E-2Q, 208 1.1 mrg 4.608315409833682489016656279567605536619E-1Q, 209 1.1 mrg 1.396870223510964882676225042258855977512E0Q, 210 1.1 mrg 1.718500293904122365894630460672081526236E0Q, 211 1.1 mrg 5.465927698800862172307352821870223855365E-1Q 212 1.1 mrg }; 213 1.1 mrg #define NP5_8D 10 214 1.1 mrg static const __float128 P5_8D[NP5_8D + 1] = { 215 1.1 mrg 2.421485545794616609951168511612060482715E-11Q, 216 1.1 mrg 8.329862750896452929030058039752327232310E-9Q, 217 1.1 mrg 1.106137992233383429630592081375289010720E-6Q, 218 1.1 mrg 7.405786153760681090127497796448503306939E-5Q, 219 1.1 mrg 2.740364785433195322492093333127633465227E-3Q, 220 1.1 mrg 5.781246470403095224872243564165254652198E-2Q, 221 1.1 mrg 6.927711353039742469918754111511109983546E-1Q, 222 1.1 mrg 4.558679283460430281188304515922826156690E0Q, 223 1.1 mrg 1.534468499844879487013168065728837900009E1Q, 224 1.1 mrg 2.313927430889218597919624843161569422745E1Q, 225 1.1 mrg 1.194506341319498844336768473218382828637E1Q, 226 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 227 1.1 mrg }; 228 1.1 mrg 229 1.1 mrg /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2), 230 1.1 mrg Peak relative error 1.4e-36 231 1.1 mrg 0.1875 <= 1/x <= 0.25 */ 232 1.1 mrg #define NP4_5N 10 233 1.1 mrg static const __float128 P4_5N[NP4_5N + 1] = { 234 1.1 mrg 1.846029078268368685834261260420933914621E-10Q, 235 1.1 mrg 3.916295939611376119377869680335444207768E-8Q, 236 1.1 mrg 3.122158792018920627984597530935323997312E-6Q, 237 1.1 mrg 1.218073444893078303994045653603392272450E-4Q, 238 1.1 mrg 2.536420827983485448140477159977981844883E-3Q, 239 1.1 mrg 2.883011322006690823959367922241169171315E-2Q, 240 1.1 mrg 1.755255190734902907438042414495469810830E-1Q, 241 1.1 mrg 5.379317079922628599870898285488723736599E-1Q, 242 1.1 mrg 7.284904050194300773890303361501726561938E-1Q, 243 1.1 mrg 3.270110346613085348094396323925000362813E-1Q, 244 1.1 mrg 1.804473805689725610052078464951722064757E-2Q, 245 1.1 mrg }; 246 1.1 mrg #define NP4_5D 9 247 1.1 mrg static const __float128 P4_5D[NP4_5D + 1] = { 248 1.1 mrg 1.575278146806816970152174364308980863569E-9Q, 249 1.1 mrg 3.361289173657099516191331123405675054321E-7Q, 250 1.1 mrg 2.704692281550877810424745289838790693708E-5Q, 251 1.1 mrg 1.070854930483999749316546199273521063543E-3Q, 252 1.1 mrg 2.282373093495295842598097265627962125411E-2Q, 253 1.1 mrg 2.692025460665354148328762368240343249830E-1Q, 254 1.1 mrg 1.739892942593664447220951225734811133759E0Q, 255 1.1 mrg 5.890727576752230385342377570386657229324E0Q, 256 1.1 mrg 9.517442287057841500750256954117735128153E0Q, 257 1.1 mrg 6.100616353935338240775363403030137736013E0Q, 258 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 259 1.1 mrg }; 260 1.1 mrg 261 1.1 mrg /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2), 262 1.1 mrg Peak relative error 3.0e-36 263 1.1 mrg 0.25 <= 1/x <= 0.3125 */ 264 1.1 mrg #define NP3r2_4N 9 265 1.1 mrg static const __float128 P3r2_4N[NP3r2_4N + 1] = { 266 1.1 mrg 8.240803130988044478595580300846665863782E-8Q, 267 1.1 mrg 1.179418958381961224222969866406483744580E-5Q, 268 1.1 mrg 6.179787320956386624336959112503824397755E-4Q, 269 1.1 mrg 1.540270833608687596420595830747166658383E-2Q, 270 1.1 mrg 1.983904219491512618376375619598837355076E-1Q, 271 1.1 mrg 1.341465722692038870390470651608301155565E0Q, 272 1.1 mrg 4.617865326696612898792238245990854646057E0Q, 273 1.1 mrg 7.435574801812346424460233180412308000587E0Q, 274 1.1 mrg 4.671327027414635292514599201278557680420E0Q, 275 1.1 mrg 7.299530852495776936690976966995187714739E-1Q, 276 1.1 mrg }; 277 1.1 mrg #define NP3r2_4D 9 278 1.1 mrg static const __float128 P3r2_4D[NP3r2_4D + 1] = { 279 1.1 mrg 7.032152009675729604487575753279187576521E-7Q, 280 1.1 mrg 1.015090352324577615777511269928856742848E-4Q, 281 1.1 mrg 5.394262184808448484302067955186308730620E-3Q, 282 1.1 mrg 1.375291438480256110455809354836988584325E-1Q, 283 1.1 mrg 1.836247144461106304788160919310404376670E0Q, 284 1.1 mrg 1.314378564254376655001094503090935880349E1Q, 285 1.1 mrg 4.957184590465712006934452500894672343488E1Q, 286 1.1 mrg 9.287394244300647738855415178790263465398E1Q, 287 1.1 mrg 7.652563275535900609085229286020552768399E1Q, 288 1.1 mrg 2.147042473003074533150718117770093209096E1Q, 289 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 290 1.1 mrg }; 291 1.1 mrg 292 1.1 mrg /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2), 293 1.1 mrg Peak relative error 1.0e-35 294 1.1 mrg 0.3125 <= 1/x <= 0.375 */ 295 1.1 mrg #define NP2r7_3r2N 9 296 1.1 mrg static const __float128 P2r7_3r2N[NP2r7_3r2N + 1] = { 297 1.1 mrg 4.599033469240421554219816935160627085991E-7Q, 298 1.1 mrg 4.665724440345003914596647144630893997284E-5Q, 299 1.1 mrg 1.684348845667764271596142716944374892756E-3Q, 300 1.1 mrg 2.802446446884455707845985913454440176223E-2Q, 301 1.1 mrg 2.321937586453963310008279956042545173930E-1Q, 302 1.1 mrg 9.640277413988055668692438709376437553804E-1Q, 303 1.1 mrg 1.911021064710270904508663334033003246028E0Q, 304 1.1 mrg 1.600811610164341450262992138893970224971E0Q, 305 1.1 mrg 4.266299218652587901171386591543457861138E-1Q, 306 1.1 mrg 1.316470424456061252962568223251247207325E-2Q, 307 1.1 mrg }; 308 1.1 mrg #define NP2r7_3r2D 8 309 1.1 mrg static const __float128 P2r7_3r2D[NP2r7_3r2D + 1] = { 310 1.1 mrg 3.924508608545520758883457108453520099610E-6Q, 311 1.1 mrg 4.029707889408829273226495756222078039823E-4Q, 312 1.1 mrg 1.484629715787703260797886463307469600219E-2Q, 313 1.1 mrg 2.553136379967180865331706538897231588685E-1Q, 314 1.1 mrg 2.229457223891676394409880026887106228740E0Q, 315 1.1 mrg 1.005708903856384091956550845198392117318E1Q, 316 1.1 mrg 2.277082659664386953166629360352385889558E1Q, 317 1.1 mrg 2.384726835193630788249826630376533988245E1Q, 318 1.1 mrg 9.700989749041320895890113781610939632410E0Q, 319 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 320 1.1 mrg }; 321 1.1 mrg 322 1.1 mrg /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2), 323 1.1 mrg Peak relative error 1.7e-36 324 1.1 mrg 0.3125 <= 1/x <= 0.4375 */ 325 1.1 mrg #define NP2r3_2r7N 9 326 1.1 mrg static const __float128 P2r3_2r7N[NP2r3_2r7N + 1] = { 327 1.1 mrg 3.916766777108274628543759603786857387402E-6Q, 328 1.1 mrg 3.212176636756546217390661984304645137013E-4Q, 329 1.1 mrg 9.255768488524816445220126081207248947118E-3Q, 330 1.1 mrg 1.214853146369078277453080641911700735354E-1Q, 331 1.1 mrg 7.855163309847214136198449861311404633665E-1Q, 332 1.1 mrg 2.520058073282978403655488662066019816540E0Q, 333 1.1 mrg 3.825136484837545257209234285382183711466E0Q, 334 1.1 mrg 2.432569427554248006229715163865569506873E0Q, 335 1.1 mrg 4.877934835018231178495030117729800489743E-1Q, 336 1.1 mrg 1.109902737860249670981355149101343427885E-2Q, 337 1.1 mrg }; 338 1.1 mrg #define NP2r3_2r7D 8 339 1.1 mrg static const __float128 P2r3_2r7D[NP2r3_2r7D + 1] = { 340 1.1 mrg 3.342307880794065640312646341190547184461E-5Q, 341 1.1 mrg 2.782182891138893201544978009012096558265E-3Q, 342 1.1 mrg 8.221304931614200702142049236141249929207E-2Q, 343 1.1 mrg 1.123728246291165812392918571987858010949E0Q, 344 1.1 mrg 7.740482453652715577233858317133423434590E0Q, 345 1.1 mrg 2.737624677567945952953322566311201919139E1Q, 346 1.1 mrg 4.837181477096062403118304137851260715475E1Q, 347 1.1 mrg 3.941098643468580791437772701093795299274E1Q, 348 1.1 mrg 1.245821247166544627558323920382547533630E1Q, 349 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 350 1.1 mrg }; 351 1.1 mrg 352 1.1 mrg /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2), 353 1.1 mrg Peak relative error 1.7e-35 354 1.1 mrg 0.4375 <= 1/x <= 0.5 */ 355 1.1 mrg #define NP2_2r3N 8 356 1.1 mrg static const __float128 P2_2r3N[NP2_2r3N + 1] = { 357 1.1 mrg 3.397930802851248553545191160608731940751E-4Q, 358 1.1 mrg 2.104020902735482418784312825637833698217E-2Q, 359 1.1 mrg 4.442291771608095963935342749477836181939E-1Q, 360 1.1 mrg 4.131797328716583282869183304291833754967E0Q, 361 1.1 mrg 1.819920169779026500146134832455189917589E1Q, 362 1.1 mrg 3.781779616522937565300309684282401791291E1Q, 363 1.1 mrg 3.459605449728864218972931220783543410347E1Q, 364 1.1 mrg 1.173594248397603882049066603238568316561E1Q, 365 1.1 mrg 9.455702270242780642835086549285560316461E-1Q, 366 1.1 mrg }; 367 1.1 mrg #define NP2_2r3D 8 368 1.1 mrg static const __float128 P2_2r3D[NP2_2r3D + 1] = { 369 1.1 mrg 2.899568897241432883079888249845707400614E-3Q, 370 1.1 mrg 1.831107138190848460767699919531132426356E-1Q, 371 1.1 mrg 3.999350044057883839080258832758908825165E0Q, 372 1.1 mrg 3.929041535867957938340569419874195303712E1Q, 373 1.1 mrg 1.884245613422523323068802689915538908291E2Q, 374 1.1 mrg 4.461469948819229734353852978424629815929E2Q, 375 1.1 mrg 5.004998753999796821224085972610636347903E2Q, 376 1.1 mrg 2.386342520092608513170837883757163414100E2Q, 377 1.1 mrg 3.791322528149347975999851588922424189957E1Q, 378 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 379 1.1 mrg }; 380 1.1 mrg 381 1.1 mrg /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x), 382 1.1 mrg Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)), 383 1.1 mrg Peak relative error 8.0e-36 384 1.1 mrg 0 <= 1/x <= .0625 */ 385 1.1 mrg #define NQ16_IN 10 386 1.1 mrg static const __float128 Q16_IN[NQ16_IN + 1] = { 387 1.1 mrg -3.917420835712508001321875734030357393421E-18Q, 388 1.1 mrg -4.440311387483014485304387406538069930457E-15Q, 389 1.1 mrg -1.951635424076926487780929645954007139616E-12Q, 390 1.1 mrg -4.318256438421012555040546775651612810513E-10Q, 391 1.1 mrg -5.231244131926180765270446557146989238020E-8Q, 392 1.1 mrg -3.540072702902043752460711989234732357653E-6Q, 393 1.1 mrg -1.311017536555269966928228052917534882984E-4Q, 394 1.1 mrg -2.495184669674631806622008769674827575088E-3Q, 395 1.1 mrg -2.141868222987209028118086708697998506716E-2Q, 396 1.1 mrg -6.184031415202148901863605871197272650090E-2Q, 397 1.1 mrg -1.922298704033332356899546792898156493887E-2Q, 398 1.1 mrg }; 399 1.1 mrg #define NQ16_ID 9 400 1.1 mrg static const __float128 Q16_ID[NQ16_ID + 1] = { 401 1.1 mrg 3.820418034066293517479619763498400162314E-17Q, 402 1.1 mrg 4.340702810799239909648911373329149354911E-14Q, 403 1.1 mrg 1.914985356383416140706179933075303538524E-11Q, 404 1.1 mrg 4.262333682610888819476498617261895474330E-9Q, 405 1.1 mrg 5.213481314722233980346462747902942182792E-7Q, 406 1.1 mrg 3.585741697694069399299005316809954590558E-5Q, 407 1.1 mrg 1.366513429642842006385029778105539457546E-3Q, 408 1.1 mrg 2.745282599850704662726337474371355160594E-2Q, 409 1.1 mrg 2.637644521611867647651200098449903330074E-1Q, 410 1.1 mrg 1.006953426110765984590782655598680488746E0Q, 411 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 412 1.1 mrg }; 413 1.1 mrg 414 1.1 mrg /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x), 415 1.1 mrg Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)), 416 1.1 mrg Peak relative error 1.9e-36 417 1.1 mrg 0.0625 <= 1/x <= 0.125 */ 418 1.1 mrg #define NQ8_16N 11 419 1.1 mrg static const __float128 Q8_16N[NQ8_16N + 1] = { 420 1.1 mrg -2.028630366670228670781362543615221542291E-17Q, 421 1.1 mrg -1.519634620380959966438130374006858864624E-14Q, 422 1.1 mrg -4.540596528116104986388796594639405114524E-12Q, 423 1.1 mrg -7.085151756671466559280490913558388648274E-10Q, 424 1.1 mrg -6.351062671323970823761883833531546885452E-8Q, 425 1.1 mrg -3.390817171111032905297982523519503522491E-6Q, 426 1.1 mrg -1.082340897018886970282138836861233213972E-4Q, 427 1.1 mrg -2.020120801187226444822977006648252379508E-3Q, 428 1.1 mrg -2.093169910981725694937457070649605557555E-2Q, 429 1.1 mrg -1.092176538874275712359269481414448063393E-1Q, 430 1.1 mrg -2.374790947854765809203590474789108718733E-1Q, 431 1.1 mrg -1.365364204556573800719985118029601401323E-1Q, 432 1.1 mrg }; 433 1.1 mrg #define NQ8_16D 11 434 1.1 mrg static const __float128 Q8_16D[NQ8_16D + 1] = { 435 1.1 mrg 1.978397614733632533581207058069628242280E-16Q, 436 1.1 mrg 1.487361156806202736877009608336766720560E-13Q, 437 1.1 mrg 4.468041406888412086042576067133365913456E-11Q, 438 1.1 mrg 7.027822074821007443672290507210594648877E-9Q, 439 1.1 mrg 6.375740580686101224127290062867976007374E-7Q, 440 1.1 mrg 3.466887658320002225888644977076410421940E-5Q, 441 1.1 mrg 1.138625640905289601186353909213719596986E-3Q, 442 1.1 mrg 2.224470799470414663443449818235008486439E-2Q, 443 1.1 mrg 2.487052928527244907490589787691478482358E-1Q, 444 1.1 mrg 1.483927406564349124649083853892380899217E0Q, 445 1.1 mrg 4.182773513276056975777258788903489507705E0Q, 446 1.1 mrg 4.419665392573449746043880892524360870944E0Q, 447 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 448 1.1 mrg }; 449 1.1 mrg 450 1.1 mrg /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x), 451 1.1 mrg Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)), 452 1.1 mrg Peak relative error 1.5e-35 453 1.1 mrg 0.125 <= 1/x <= 0.1875 */ 454 1.1 mrg #define NQ5_8N 10 455 1.1 mrg static const __float128 Q5_8N[NQ5_8N + 1] = { 456 1.1 mrg -3.656082407740970534915918390488336879763E-13Q, 457 1.1 mrg -1.344660308497244804752334556734121771023E-10Q, 458 1.1 mrg -1.909765035234071738548629788698150760791E-8Q, 459 1.1 mrg -1.366668038160120210269389551283666716453E-6Q, 460 1.1 mrg -5.392327355984269366895210704976314135683E-5Q, 461 1.1 mrg -1.206268245713024564674432357634540343884E-3Q, 462 1.1 mrg -1.515456784370354374066417703736088291287E-2Q, 463 1.1 mrg -1.022454301137286306933217746545237098518E-1Q, 464 1.1 mrg -3.373438906472495080504907858424251082240E-1Q, 465 1.1 mrg -4.510782522110845697262323973549178453405E-1Q, 466 1.1 mrg -1.549000892545288676809660828213589804884E-1Q, 467 1.1 mrg }; 468 1.1 mrg #define NQ5_8D 10 469 1.1 mrg static const __float128 Q5_8D[NQ5_8D + 1] = { 470 1.1 mrg 3.565550843359501079050699598913828460036E-12Q, 471 1.1 mrg 1.321016015556560621591847454285330528045E-9Q, 472 1.1 mrg 1.897542728662346479999969679234270605975E-7Q, 473 1.1 mrg 1.381720283068706710298734234287456219474E-5Q, 474 1.1 mrg 5.599248147286524662305325795203422873725E-4Q, 475 1.1 mrg 1.305442352653121436697064782499122164843E-2Q, 476 1.1 mrg 1.750234079626943298160445750078631894985E-1Q, 477 1.1 mrg 1.311420542073436520965439883806946678491E0Q, 478 1.1 mrg 5.162757689856842406744504211089724926650E0Q, 479 1.1 mrg 9.527760296384704425618556332087850581308E0Q, 480 1.1 mrg 6.604648207463236667912921642545100248584E0Q, 481 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 482 1.1 mrg }; 483 1.1 mrg 484 1.1 mrg /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x), 485 1.1 mrg Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)), 486 1.1 mrg Peak relative error 1.3e-35 487 1.1 mrg 0.1875 <= 1/x <= 0.25 */ 488 1.1 mrg #define NQ4_5N 10 489 1.1 mrg static const __float128 Q4_5N[NQ4_5N + 1] = { 490 1.1 mrg -4.079513568708891749424783046520200903755E-11Q, 491 1.1 mrg -9.326548104106791766891812583019664893311E-9Q, 492 1.1 mrg -8.016795121318423066292906123815687003356E-7Q, 493 1.1 mrg -3.372350544043594415609295225664186750995E-5Q, 494 1.1 mrg -7.566238665947967882207277686375417983917E-4Q, 495 1.1 mrg -9.248861580055565402130441618521591282617E-3Q, 496 1.1 mrg -6.033106131055851432267702948850231270338E-2Q, 497 1.1 mrg -1.966908754799996793730369265431584303447E-1Q, 498 1.1 mrg -2.791062741179964150755788226623462207560E-1Q, 499 1.1 mrg -1.255478605849190549914610121863534191666E-1Q, 500 1.1 mrg -4.320429862021265463213168186061696944062E-3Q, 501 1.1 mrg }; 502 1.1 mrg #define NQ4_5D 9 503 1.1 mrg static const __float128 Q4_5D[NQ4_5D + 1] = { 504 1.1 mrg 3.978497042580921479003851216297330701056E-10Q, 505 1.1 mrg 9.203304163828145809278568906420772246666E-8Q, 506 1.1 mrg 8.059685467088175644915010485174545743798E-6Q, 507 1.1 mrg 3.490187375993956409171098277561669167446E-4Q, 508 1.1 mrg 8.189109654456872150100501732073810028829E-3Q, 509 1.1 mrg 1.072572867311023640958725265762483033769E-1Q, 510 1.1 mrg 7.790606862409960053675717185714576937994E-1Q, 511 1.1 mrg 3.016049768232011196434185423512777656328E0Q, 512 1.1 mrg 5.722963851442769787733717162314477949360E0Q, 513 1.1 mrg 4.510527838428473279647251350931380867663E0Q, 514 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 515 1.1 mrg }; 516 1.1 mrg 517 1.1 mrg /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x), 518 1.1 mrg Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)), 519 1.1 mrg Peak relative error 2.1e-35 520 1.1 mrg 0.25 <= 1/x <= 0.3125 */ 521 1.1 mrg #define NQ3r2_4N 9 522 1.1 mrg static const __float128 Q3r2_4N[NQ3r2_4N + 1] = { 523 1.1 mrg -1.087480809271383885936921889040388133627E-8Q, 524 1.1 mrg -1.690067828697463740906962973479310170932E-6Q, 525 1.1 mrg -9.608064416995105532790745641974762550982E-5Q, 526 1.1 mrg -2.594198839156517191858208513873961837410E-3Q, 527 1.1 mrg -3.610954144421543968160459863048062977822E-2Q, 528 1.1 mrg -2.629866798251843212210482269563961685666E-1Q, 529 1.1 mrg -9.709186825881775885917984975685752956660E-1Q, 530 1.1 mrg -1.667521829918185121727268867619982417317E0Q, 531 1.1 mrg -1.109255082925540057138766105229900943501E0Q, 532 1.1 mrg -1.812932453006641348145049323713469043328E-1Q, 533 1.1 mrg }; 534 1.1 mrg #define NQ3r2_4D 9 535 1.1 mrg static const __float128 Q3r2_4D[NQ3r2_4D + 1] = { 536 1.1 mrg 1.060552717496912381388763753841473407026E-7Q, 537 1.1 mrg 1.676928002024920520786883649102388708024E-5Q, 538 1.1 mrg 9.803481712245420839301400601140812255737E-4Q, 539 1.1 mrg 2.765559874262309494758505158089249012930E-2Q, 540 1.1 mrg 4.117921827792571791298862613287549140706E-1Q, 541 1.1 mrg 3.323769515244751267093378361930279161413E0Q, 542 1.1 mrg 1.436602494405814164724810151689705353670E1Q, 543 1.1 mrg 3.163087869617098638064881410646782408297E1Q, 544 1.1 mrg 3.198181264977021649489103980298349589419E1Q, 545 1.1 mrg 1.203649258862068431199471076202897823272E1Q, 546 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 547 1.1 mrg }; 548 1.1 mrg 549 1.1 mrg /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x), 550 1.1 mrg Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)), 551 1.1 mrg Peak relative error 1.6e-36 552 1.1 mrg 0.3125 <= 1/x <= 0.375 */ 553 1.1 mrg #define NQ2r7_3r2N 9 554 1.1 mrg static const __float128 Q2r7_3r2N[NQ2r7_3r2N + 1] = { 555 1.1 mrg -1.723405393982209853244278760171643219530E-7Q, 556 1.1 mrg -2.090508758514655456365709712333460087442E-5Q, 557 1.1 mrg -9.140104013370974823232873472192719263019E-4Q, 558 1.1 mrg -1.871349499990714843332742160292474780128E-2Q, 559 1.1 mrg -1.948930738119938669637865956162512983416E-1Q, 560 1.1 mrg -1.048764684978978127908439526343174139788E0Q, 561 1.1 mrg -2.827714929925679500237476105843643064698E0Q, 562 1.1 mrg -3.508761569156476114276988181329773987314E0Q, 563 1.1 mrg -1.669332202790211090973255098624488308989E0Q, 564 1.1 mrg -1.930796319299022954013840684651016077770E-1Q, 565 1.1 mrg }; 566 1.1 mrg #define NQ2r7_3r2D 9 567 1.1 mrg static const __float128 Q2r7_3r2D[NQ2r7_3r2D + 1] = { 568 1.1 mrg 1.680730662300831976234547482334347983474E-6Q, 569 1.1 mrg 2.084241442440551016475972218719621841120E-4Q, 570 1.1 mrg 9.445316642108367479043541702688736295579E-3Q, 571 1.1 mrg 2.044637889456631896650179477133252184672E-1Q, 572 1.1 mrg 2.316091982244297350829522534435350078205E0Q, 573 1.1 mrg 1.412031891783015085196708811890448488865E1Q, 574 1.1 mrg 4.583830154673223384837091077279595496149E1Q, 575 1.1 mrg 7.549520609270909439885998474045974122261E1Q, 576 1.1 mrg 5.697605832808113367197494052388203310638E1Q, 577 1.1 mrg 1.601496240876192444526383314589371686234E1Q, 578 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 579 1.1 mrg }; 580 1.1 mrg 581 1.1 mrg /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x), 582 1.1 mrg Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)), 583 1.1 mrg Peak relative error 9.5e-36 584 1.1 mrg 0.375 <= 1/x <= 0.4375 */ 585 1.1 mrg #define NQ2r3_2r7N 9 586 1.1 mrg static const __float128 Q2r3_2r7N[NQ2r3_2r7N + 1] = { 587 1.1 mrg -8.603042076329122085722385914954878953775E-7Q, 588 1.1 mrg -7.701746260451647874214968882605186675720E-5Q, 589 1.1 mrg -2.407932004380727587382493696877569654271E-3Q, 590 1.1 mrg -3.403434217607634279028110636919987224188E-2Q, 591 1.1 mrg -2.348707332185238159192422084985713102877E-1Q, 592 1.1 mrg -7.957498841538254916147095255700637463207E-1Q, 593 1.1 mrg -1.258469078442635106431098063707934348577E0Q, 594 1.1 mrg -8.162415474676345812459353639449971369890E-1Q, 595 1.1 mrg -1.581783890269379690141513949609572806898E-1Q, 596 1.1 mrg -1.890595651683552228232308756569450822905E-3Q, 597 1.1 mrg }; 598 1.1 mrg #define NQ2r3_2r7D 8 599 1.1 mrg static const __float128 Q2r3_2r7D[NQ2r3_2r7D + 1] = { 600 1.1 mrg 8.390017524798316921170710533381568175665E-6Q, 601 1.1 mrg 7.738148683730826286477254659973968763659E-4Q, 602 1.1 mrg 2.541480810958665794368759558791634341779E-2Q, 603 1.1 mrg 3.878879789711276799058486068562386244873E-1Q, 604 1.1 mrg 3.003783779325811292142957336802456109333E0Q, 605 1.1 mrg 1.206480374773322029883039064575464497400E1Q, 606 1.1 mrg 2.458414064785315978408974662900438351782E1Q, 607 1.1 mrg 2.367237826273668567199042088835448715228E1Q, 608 1.1 mrg 9.231451197519171090875569102116321676763E0Q, 609 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 610 1.1 mrg }; 611 1.1 mrg 612 1.1 mrg /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x), 613 1.1 mrg Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)), 614 1.1 mrg Peak relative error 1.4e-36 615 1.1 mrg 0.4375 <= 1/x <= 0.5 */ 616 1.1 mrg #define NQ2_2r3N 9 617 1.1 mrg static const __float128 Q2_2r3N[NQ2_2r3N + 1] = { 618 1.1 mrg -5.552507516089087822166822364590806076174E-6Q, 619 1.1 mrg -4.135067659799500521040944087433752970297E-4Q, 620 1.1 mrg -1.059928728869218962607068840646564457980E-2Q, 621 1.1 mrg -1.212070036005832342565792241385459023801E-1Q, 622 1.1 mrg -6.688350110633603958684302153362735625156E-1Q, 623 1.1 mrg -1.793587878197360221340277951304429821582E0Q, 624 1.1 mrg -2.225407682237197485644647380483725045326E0Q, 625 1.1 mrg -1.123402135458940189438898496348239744403E0Q, 626 1.1 mrg -1.679187241566347077204805190763597299805E-1Q, 627 1.1 mrg -1.458550613639093752909985189067233504148E-3Q, 628 1.1 mrg }; 629 1.1 mrg #define NQ2_2r3D 8 630 1.1 mrg static const __float128 Q2_2r3D[NQ2_2r3D + 1] = { 631 1.1 mrg 5.415024336507980465169023996403597916115E-5Q, 632 1.1 mrg 4.179246497380453022046357404266022870788E-3Q, 633 1.1 mrg 1.136306384261959483095442402929502368598E-1Q, 634 1.1 mrg 1.422640343719842213484515445393284072830E0Q, 635 1.1 mrg 8.968786703393158374728850922289204805764E0Q, 636 1.1 mrg 2.914542473339246127533384118781216495934E1Q, 637 1.1 mrg 4.781605421020380669870197378210457054685E1Q, 638 1.1 mrg 3.693865837171883152382820584714795072937E1Q, 639 1.1 mrg 1.153220502744204904763115556224395893076E1Q, 640 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 641 1.1 mrg }; 642 1.1 mrg 643 1.1 mrg 644 1.1 mrg /* Evaluate P[n] x^n + P[n-1] x^(n-1) + ... + P[0] */ 645 1.1 mrg 646 1.1 mrg static __float128 647 1.1 mrg neval (__float128 x, const __float128 *p, int n) 648 1.1 mrg { 649 1.1 mrg __float128 y; 650 1.1 mrg 651 1.1 mrg p += n; 652 1.1 mrg y = *p--; 653 1.1 mrg do 654 1.1 mrg { 655 1.1 mrg y = y * x + *p--; 656 1.1 mrg } 657 1.1 mrg while (--n > 0); 658 1.1 mrg return y; 659 1.1 mrg } 660 1.1 mrg 661 1.1 mrg 662 1.1 mrg /* Evaluate x^n+1 + P[n] x^(n) + P[n-1] x^(n-1) + ... + P[0] */ 663 1.1 mrg 664 1.1 mrg static __float128 665 1.1 mrg deval (__float128 x, const __float128 *p, int n) 666 1.1 mrg { 667 1.1 mrg __float128 y; 668 1.1 mrg 669 1.1 mrg p += n; 670 1.1 mrg y = x + *p--; 671 1.1 mrg do 672 1.1 mrg { 673 1.1 mrg y = y * x + *p--; 674 1.1 mrg } 675 1.1 mrg while (--n > 0); 676 1.1 mrg return y; 677 1.1 mrg } 678 1.1 mrg 679 1.1 mrg 680 1.1 mrg /* Bessel function of the first kind, order one. */ 681 1.1 mrg 682 1.1 mrg __float128 683 1.1 mrg j1q (__float128 x) 684 1.1 mrg { 685 1.1 mrg __float128 xx, xinv, z, p, q, c, s, cc, ss; 686 1.1 mrg 687 1.1 mrg if (! finiteq (x)) 688 1.1 mrg { 689 1.1 mrg if (x != x) 690 1.1 mrg return x + x; 691 1.1 mrg else 692 1.1 mrg return 0; 693 1.1 mrg } 694 1.1 mrg if (x == 0) 695 1.1 mrg return x; 696 1.1 mrg xx = fabsq (x); 697 1.1 mrg if (xx <= 0x1p-58Q) 698 1.1 mrg { 699 1.1 mrg __float128 ret = x * 0.5Q; 700 1.1 mrg math_check_force_underflow (ret); 701 1.1 mrg if (ret == 0) 702 1.1 mrg errno = ERANGE; 703 1.1 mrg return ret; 704 1.1 mrg } 705 1.1 mrg if (xx <= 2) 706 1.1 mrg { 707 1.1 mrg /* 0 <= x <= 2 */ 708 1.1 mrg z = xx * xx; 709 1.1 mrg p = xx * z * neval (z, J0_2N, NJ0_2N) / deval (z, J0_2D, NJ0_2D); 710 1.1 mrg p += 0.5Q * xx; 711 1.1 mrg if (x < 0) 712 1.1 mrg p = -p; 713 1.1 mrg return p; 714 1.1 mrg } 715 1.1 mrg 716 1.1 mrg /* X = x - 3 pi/4 717 1.1 mrg cos(X) = cos(x) cos(3 pi/4) + sin(x) sin(3 pi/4) 718 1.1 mrg = 1/sqrt(2) * (-cos(x) + sin(x)) 719 1.1 mrg sin(X) = sin(x) cos(3 pi/4) - cos(x) sin(3 pi/4) 720 1.1 mrg = -1/sqrt(2) * (sin(x) + cos(x)) 721 1.1 mrg cf. Fdlibm. */ 722 1.1 mrg sincosq (xx, &s, &c); 723 1.1 mrg ss = -s - c; 724 1.1 mrg cc = s - c; 725 1.1 mrg if (xx <= FLT128_MAX / 2) 726 1.1 mrg { 727 1.1 mrg z = cosq (xx + xx); 728 1.1 mrg if ((s * c) > 0) 729 1.1 mrg cc = z / ss; 730 1.1 mrg else 731 1.1 mrg ss = z / cc; 732 1.1 mrg } 733 1.1 mrg 734 1.1 mrg if (xx > 0x1p256Q) 735 1.1 mrg { 736 1.1 mrg z = ONEOSQPI * cc / sqrtq (xx); 737 1.1 mrg if (x < 0) 738 1.1 mrg z = -z; 739 1.1 mrg return z; 740 1.1 mrg } 741 1.1 mrg 742 1.1 mrg xinv = 1 / xx; 743 1.1 mrg z = xinv * xinv; 744 1.1 mrg if (xinv <= 0.25) 745 1.1 mrg { 746 1.1 mrg if (xinv <= 0.125) 747 1.1 mrg { 748 1.1 mrg if (xinv <= 0.0625) 749 1.1 mrg { 750 1.1 mrg p = neval (z, P16_IN, NP16_IN) / deval (z, P16_ID, NP16_ID); 751 1.1 mrg q = neval (z, Q16_IN, NQ16_IN) / deval (z, Q16_ID, NQ16_ID); 752 1.1 mrg } 753 1.1 mrg else 754 1.1 mrg { 755 1.1 mrg p = neval (z, P8_16N, NP8_16N) / deval (z, P8_16D, NP8_16D); 756 1.1 mrg q = neval (z, Q8_16N, NQ8_16N) / deval (z, Q8_16D, NQ8_16D); 757 1.1 mrg } 758 1.1 mrg } 759 1.1 mrg else if (xinv <= 0.1875) 760 1.1 mrg { 761 1.1 mrg p = neval (z, P5_8N, NP5_8N) / deval (z, P5_8D, NP5_8D); 762 1.1 mrg q = neval (z, Q5_8N, NQ5_8N) / deval (z, Q5_8D, NQ5_8D); 763 1.1 mrg } 764 1.1 mrg else 765 1.1 mrg { 766 1.1 mrg p = neval (z, P4_5N, NP4_5N) / deval (z, P4_5D, NP4_5D); 767 1.1 mrg q = neval (z, Q4_5N, NQ4_5N) / deval (z, Q4_5D, NQ4_5D); 768 1.1 mrg } 769 1.1 mrg } /* .25 */ 770 1.1 mrg else /* if (xinv <= 0.5) */ 771 1.1 mrg { 772 1.1 mrg if (xinv <= 0.375) 773 1.1 mrg { 774 1.1 mrg if (xinv <= 0.3125) 775 1.1 mrg { 776 1.1 mrg p = neval (z, P3r2_4N, NP3r2_4N) / deval (z, P3r2_4D, NP3r2_4D); 777 1.1 mrg q = neval (z, Q3r2_4N, NQ3r2_4N) / deval (z, Q3r2_4D, NQ3r2_4D); 778 1.1 mrg } 779 1.1 mrg else 780 1.1 mrg { 781 1.1 mrg p = neval (z, P2r7_3r2N, NP2r7_3r2N) 782 1.1 mrg / deval (z, P2r7_3r2D, NP2r7_3r2D); 783 1.1 mrg q = neval (z, Q2r7_3r2N, NQ2r7_3r2N) 784 1.1 mrg / deval (z, Q2r7_3r2D, NQ2r7_3r2D); 785 1.1 mrg } 786 1.1 mrg } 787 1.1 mrg else if (xinv <= 0.4375) 788 1.1 mrg { 789 1.1 mrg p = neval (z, P2r3_2r7N, NP2r3_2r7N) 790 1.1 mrg / deval (z, P2r3_2r7D, NP2r3_2r7D); 791 1.1 mrg q = neval (z, Q2r3_2r7N, NQ2r3_2r7N) 792 1.1 mrg / deval (z, Q2r3_2r7D, NQ2r3_2r7D); 793 1.1 mrg } 794 1.1 mrg else 795 1.1 mrg { 796 1.1 mrg p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D); 797 1.1 mrg q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D); 798 1.1 mrg } 799 1.1 mrg } 800 1.1 mrg p = 1 + z * p; 801 1.1 mrg q = z * q; 802 1.1 mrg q = q * xinv + 0.375Q * xinv; 803 1.1 mrg z = ONEOSQPI * (p * cc - q * ss) / sqrtq (xx); 804 1.1 mrg if (x < 0) 805 1.1 mrg z = -z; 806 1.1 mrg return z; 807 1.1 mrg } 808 1.1 mrg 809 1.1 mrg 810 1.1 mrg 811 1.1 mrg /* Y1(x) = 2/pi * (log(x) * J1(x) - 1/x) + x R(x^2) 812 1.1 mrg Peak relative error 6.2e-38 813 1.1 mrg 0 <= x <= 2 */ 814 1.1 mrg #define NY0_2N 7 815 1.1 mrg static const __float128 Y0_2N[NY0_2N + 1] = { 816 1.1 mrg -6.804415404830253804408698161694720833249E19Q, 817 1.1 mrg 1.805450517967019908027153056150465849237E19Q, 818 1.1 mrg -8.065747497063694098810419456383006737312E17Q, 819 1.1 mrg 1.401336667383028259295830955439028236299E16Q, 820 1.1 mrg -1.171654432898137585000399489686629680230E14Q, 821 1.1 mrg 5.061267920943853732895341125243428129150E11Q, 822 1.1 mrg -1.096677850566094204586208610960870217970E9Q, 823 1.1 mrg 9.541172044989995856117187515882879304461E5Q, 824 1.1 mrg }; 825 1.1 mrg #define NY0_2D 7 826 1.1 mrg static const __float128 Y0_2D[NY0_2D + 1] = { 827 1.1 mrg 3.470629591820267059538637461549677594549E20Q, 828 1.1 mrg 4.120796439009916326855848107545425217219E18Q, 829 1.1 mrg 2.477653371652018249749350657387030814542E16Q, 830 1.1 mrg 9.954678543353888958177169349272167762797E13Q, 831 1.1 mrg 2.957927997613630118216218290262851197754E11Q, 832 1.1 mrg 6.748421382188864486018861197614025972118E8Q, 833 1.1 mrg 1.173453425218010888004562071020305709319E6Q, 834 1.1 mrg 1.450335662961034949894009554536003377187E3Q, 835 1.1 mrg /* 1.000000000000000000000000000000000000000E0 */ 836 1.1 mrg }; 837 1.1 mrg 838 1.1 mrg 839 1.1 mrg /* Bessel function of the second kind, order one. */ 840 1.1 mrg 841 1.1 mrg __float128 842 1.1 mrg y1q (__float128 x) 843 1.1 mrg { 844 1.1 mrg __float128 xx, xinv, z, p, q, c, s, cc, ss; 845 1.1 mrg 846 1.1 mrg if (! finiteq (x)) 847 1.1 mrg return 1 / (x + x * x); 848 1.1 mrg if (x <= 0) 849 1.1 mrg { 850 1.1 mrg if (x < 0) 851 1.1 mrg return (zero / (zero * x)); 852 1.1 mrg return -1 / zero; /* -inf and divide by zero exception. */ 853 1.1 mrg } 854 1.1 mrg xx = fabsq (x); 855 1.1 mrg if (xx <= 0x1p-114) 856 1.1 mrg { 857 1.1 mrg z = -TWOOPI / x; 858 1.1 mrg if (isinfq (z)) 859 1.1 mrg errno = ERANGE; 860 1.1 mrg return z; 861 1.1 mrg } 862 1.1 mrg if (xx <= 2) 863 1.1 mrg { 864 1.1 mrg /* 0 <= x <= 2 */ 865 1.1 mrg SET_RESTORE_ROUNDF128 (FE_TONEAREST); 866 1.1 mrg z = xx * xx; 867 1.1 mrg p = xx * neval (z, Y0_2N, NY0_2N) / deval (z, Y0_2D, NY0_2D); 868 1.1 mrg p = -TWOOPI / xx + p; 869 1.1 mrg p = TWOOPI * logq (x) * j1q (x) + p; 870 1.1 mrg return p; 871 1.1 mrg } 872 1.1 mrg 873 1.1 mrg /* X = x - 3 pi/4 874 1.1 mrg cos(X) = cos(x) cos(3 pi/4) + sin(x) sin(3 pi/4) 875 1.1 mrg = 1/sqrt(2) * (-cos(x) + sin(x)) 876 1.1 mrg sin(X) = sin(x) cos(3 pi/4) - cos(x) sin(3 pi/4) 877 1.1 mrg = -1/sqrt(2) * (sin(x) + cos(x)) 878 1.1 mrg cf. Fdlibm. */ 879 1.1 mrg sincosq (xx, &s, &c); 880 1.1 mrg ss = -s - c; 881 1.1 mrg cc = s - c; 882 1.1 mrg if (xx <= FLT128_MAX / 2) 883 1.1 mrg { 884 1.1 mrg z = cosq (xx + xx); 885 1.1 mrg if ((s * c) > 0) 886 1.1 mrg cc = z / ss; 887 1.1 mrg else 888 1.1 mrg ss = z / cc; 889 1.1 mrg } 890 1.1 mrg 891 1.1 mrg if (xx > 0x1p256Q) 892 1.1 mrg return ONEOSQPI * ss / sqrtq (xx); 893 1.1 mrg 894 1.1 mrg xinv = 1 / xx; 895 1.1 mrg z = xinv * xinv; 896 1.1 mrg if (xinv <= 0.25) 897 1.1 mrg { 898 1.1 mrg if (xinv <= 0.125) 899 1.1 mrg { 900 1.1 mrg if (xinv <= 0.0625) 901 1.1 mrg { 902 1.1 mrg p = neval (z, P16_IN, NP16_IN) / deval (z, P16_ID, NP16_ID); 903 1.1 mrg q = neval (z, Q16_IN, NQ16_IN) / deval (z, Q16_ID, NQ16_ID); 904 1.1 mrg } 905 1.1 mrg else 906 1.1 mrg { 907 1.1 mrg p = neval (z, P8_16N, NP8_16N) / deval (z, P8_16D, NP8_16D); 908 1.1 mrg q = neval (z, Q8_16N, NQ8_16N) / deval (z, Q8_16D, NQ8_16D); 909 1.1 mrg } 910 1.1 mrg } 911 1.1 mrg else if (xinv <= 0.1875) 912 1.1 mrg { 913 1.1 mrg p = neval (z, P5_8N, NP5_8N) / deval (z, P5_8D, NP5_8D); 914 1.1 mrg q = neval (z, Q5_8N, NQ5_8N) / deval (z, Q5_8D, NQ5_8D); 915 1.1 mrg } 916 1.1 mrg else 917 1.1 mrg { 918 1.1 mrg p = neval (z, P4_5N, NP4_5N) / deval (z, P4_5D, NP4_5D); 919 1.1 mrg q = neval (z, Q4_5N, NQ4_5N) / deval (z, Q4_5D, NQ4_5D); 920 1.1 mrg } 921 1.1 mrg } /* .25 */ 922 1.1 mrg else /* if (xinv <= 0.5) */ 923 1.1 mrg { 924 1.1 mrg if (xinv <= 0.375) 925 1.1 mrg { 926 1.1 mrg if (xinv <= 0.3125) 927 1.1 mrg { 928 1.1 mrg p = neval (z, P3r2_4N, NP3r2_4N) / deval (z, P3r2_4D, NP3r2_4D); 929 1.1 mrg q = neval (z, Q3r2_4N, NQ3r2_4N) / deval (z, Q3r2_4D, NQ3r2_4D); 930 1.1 mrg } 931 1.1 mrg else 932 1.1 mrg { 933 1.1 mrg p = neval (z, P2r7_3r2N, NP2r7_3r2N) 934 1.1 mrg / deval (z, P2r7_3r2D, NP2r7_3r2D); 935 1.1 mrg q = neval (z, Q2r7_3r2N, NQ2r7_3r2N) 936 1.1 mrg / deval (z, Q2r7_3r2D, NQ2r7_3r2D); 937 1.1 mrg } 938 1.1 mrg } 939 1.1 mrg else if (xinv <= 0.4375) 940 1.1 mrg { 941 1.1 mrg p = neval (z, P2r3_2r7N, NP2r3_2r7N) 942 1.1 mrg / deval (z, P2r3_2r7D, NP2r3_2r7D); 943 1.1 mrg q = neval (z, Q2r3_2r7N, NQ2r3_2r7N) 944 1.1 mrg / deval (z, Q2r3_2r7D, NQ2r3_2r7D); 945 1.1 mrg } 946 1.1 mrg else 947 1.1 mrg { 948 1.1 mrg p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D); 949 1.1 mrg q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D); 950 1.1 mrg } 951 1.1 mrg } 952 1.1 mrg p = 1 + z * p; 953 1.1 mrg q = z * q; 954 1.1 mrg q = q * xinv + 0.375Q * xinv; 955 1.1 mrg z = ONEOSQPI * (p * ss + q * cc) / sqrtq (xx); 956 1.1 mrg return z; 957 1.1 mrg } 958