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