Print this page
    
5261 libm should stop using synonyms.h
5298 fabs is 0-sized, confuses dis(1) and others
Reviewed by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
Approved by: Gordon Ross <gwr@nexenta.com>
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/lib/libm/common/R/besself.c
          +++ new/usr/src/lib/libm/common/R/besself.c
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License (the "License").
   6    6   * You may not use this file except in compliance with the License.
   7    7   *
   8    8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9    9   * or http://www.opensolaris.org/os/licensing.
  10   10   * See the License for the specific language governing permissions
  11   11   * and limitations under the License.
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  
    | 
      ↓ open down ↓ | 
    18 lines elided | 
    
      ↑ open up ↑ | 
  
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  23   23   */
  24   24  /*
  25   25   * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  26   26   * Use is subject to license terms.
  27   27   */
  28   28  
  29      -#pragma weak j0f = __j0f
  30      -#pragma weak j1f = __j1f
  31      -#pragma weak jnf = __jnf
  32      -#pragma weak y0f = __y0f
  33      -#pragma weak y1f = __y1f
  34      -#pragma weak ynf = __ynf
       29 +#pragma weak __j0f = j0f
       30 +#pragma weak __j1f = j1f
       31 +#pragma weak __jnf = jnf
       32 +#pragma weak __y0f = y0f
       33 +#pragma weak __y1f = y1f
       34 +#pragma weak __ynf = ynf
  35   35  
  36   36  #include "libm.h"
  37   37  #include <float.h>
  38   38  
  39   39  #if defined(__i386) && !defined(__amd64)
  40   40  extern int __swapRP(int);
  41   41  #endif
  42   42  
  43   43  static const float
  44   44          zerof   = 0.0f,
  45   45          onef    = 1.0f;
  46   46  
  47   47  static const double C[] = {
  48   48          0.0,
  49   49          -0.125,
  50   50          0.25,
  51   51          0.375,
  52   52          0.5,
  53   53          1.0,
  54   54          2.0,
  55   55          8.0,
  56   56          0.5641895835477562869480794515607725858441,     /* 1/sqrt(pi) */
  57   57          0.636619772367581343075535053490057448, /* 2/pi */
  58   58          1.0e9,
  59   59  };
  60   60  
  61   61  #define zero    C[0]
  62   62  #define neighth C[1]
  63   63  #define quarter C[2]
  64   64  #define three8  C[3]
  65   65  #define half    C[4]
  66   66  #define one     C[5]
  67   67  #define two     C[6]
  68   68  #define eight   C[7]
  69   69  #define isqrtpi C[8]
  70   70  #define tpi     C[9]
  71   71  #define big     C[10]
  72   72  
  73   73  static const double Cj0y0[] = {
  74   74          0.4861344183386052721391238447e5,       /* pr */
  75   75          0.1377662549407112278133438945e6,
  76   76          0.1222466364088289731869114004e6,
  77   77          0.4107070084315176135583353374e5,
  78   78          0.5026073801860637125889039915e4,
  79   79          0.1783193659125479654541542419e3,
  80   80          0.88010344055383421691677564e0,
  81   81          0.4861344183386052721414037058e5,       /* ps */
  82   82          0.1378196632630384670477582699e6,
  83   83          0.1223967185341006542748936787e6,
  84   84          0.4120150243795353639995862617e5,
  85   85          0.5068271181053546392490184353e4,
  86   86          0.1829817905472769960535671664e3,
  87   87          1.0,
  88   88          -0.1731210995701068539185611951e3,      /* qr */
  89   89          -0.5522559165936166961235240613e3,
  90   90          -0.5604935606637346590614529613e3,
  91   91          -0.2200430300226009379477365011e3,
  92   92          -0.323869355375648849771296746e2,
  93   93          -0.14294979207907956223499258e1,
  94   94          -0.834690374102384988158918e-2,
  95   95          0.1107975037248683865326709645e5,       /* qs */
  96   96          0.3544581680627082674651471873e5,
  97   97          0.3619118937918394132179019059e5,
  98   98          0.1439895563565398007471485822e5,
  99   99          0.2190277023344363955930226234e4,
 100  100          0.106695157020407986137501682e3,
 101  101          1.0,
 102  102  };
 103  103  
 104  104  #define pr      Cj0y0
 105  105  #define ps      (Cj0y0+7)
 106  106  #define qr      (Cj0y0+14)
 107  107  #define qs      (Cj0y0+21)
 108  108  
 109  109  static const double Cj0[] = {
 110  110          -2.500000000000003622131880894830476755537e-0001,       /* r0 */
 111  111          1.095597547334830263234433855932375353303e-0002,
 112  112          -1.819734750463320921799187258987098087697e-0004,
 113  113          9.977001946806131657544212501069893930846e-0007,
 114  114          1.0,                                                    /* s0 */
 115  115          1.867609810662950169966782360588199673741e-0002,
 116  116          1.590389206181565490878430827706972074208e-0004,
 117  117          6.520867386742583632375520147714499522721e-0007,
 118  118          9.999999999999999942156495584397047660949e-0001,        /* r1 */
 119  119          -2.389887722731319130476839836908143731281e-0001,
 120  120          1.293359476138939027791270393439493640570e-0002,
 121  121          -2.770985642343140122168852400228563364082e-0004,
 122  122          2.905241575772067678086738389169625218912e-0006,
 123  123          -1.636846356264052597969042009265043251279e-0008,
 124  124          5.072306160724884775085431059052611737827e-0011,
 125  125          -8.187060730684066824228914775146536139112e-0014,
 126  126          5.422219326959949863954297860723723423842e-0017,
 127  127          1.0,                                                    /* s1 */
 128  128          1.101122772686807702762104741932076228349e-0002,
 129  129          6.140169310641649223411427764669143978228e-0005,
 130  130          2.292035877515152097976946119293215705250e-0007,
 131  131          6.356910426504644334558832036362219583789e-0010,
 132  132          1.366626326900219555045096999553948891401e-0012,
 133  133          2.280399586866739522891837985560481180088e-0015,
 134  134          2.801559820648939665270492520004836611187e-0018,
 135  135          2.073101088320349159764410261466350732968e-0021,
 136  136  };
 137  137  
 138  138  #define r0      Cj0
 139  139  #define s0      (Cj0+4)
 140  140  #define r1      (Cj0+8)
 141  141  #define s1      (Cj0+17)
 142  142  
 143  143  static const double Cy0[] = {
 144  144          -7.380429510868722526754723020704317641941e-0002,       /* u0 */
 145  145          1.772607102684869924301459663049874294814e-0001,
 146  146          -1.524370666542713828604078090970799356306e-0002,
 147  147          4.650819100693891757143771557629924591915e-0004,
 148  148          -7.125768872339528975036316108718239946022e-0006,
 149  149          6.411017001656104598327565004771515257146e-0008,
 150  150          -3.694275157433032553021246812379258781665e-0010,
 151  151          1.434364544206266624252820889648445263842e-0012,
 152  152          -3.852064731859936455895036286874139896861e-0015,
 153  153          7.182052899726138381739945881914874579696e-0018,
 154  154          -9.060556574619677567323741194079797987200e-0021,
 155  155          7.124435467408860515265552217131230511455e-0024,
 156  156          -2.709726774636397615328813121715432044771e-0027,
 157  157          1.0,                                                    /* v0 */
 158  158          4.678678931512549002587702477349214886475e-0003,
 159  159          9.486828955529948534822800829497565178985e-0006,
 160  160          1.001495929158861646659010844136682454906e-0008,
 161  161          4.725338116256021660204443235685358593611e-0012,
 162  162  };
 163  163  
 164  164  #define u0      Cy0
 165  165  #define v0      (Cy0+13)
 166  166  
 167  167  static const double Cj1y1[] = {
 168  168          -0.4435757816794127857114720794e7,      /* pr0 */
 169  169          -0.9942246505077641195658377899e7,
 170  170          -0.6603373248364939109255245434e7,
 171  171          -0.1523529351181137383255105722e7,
 172  172          -0.1098240554345934672737413139e6,
 173  173          -0.1611616644324610116477412898e4,
 174  174          -0.4435757816794127856828016962e7,      /* ps0 */
 175  175          -0.9934124389934585658967556309e7,
 176  176          -0.6585339479723087072826915069e7,
 177  177          -0.1511809506634160881644546358e7,
 178  178          -0.1072638599110382011903063867e6,
 179  179          -0.1455009440190496182453565068e4,
 180  180          0.3322091340985722351859704442e5,       /* qr0 */
 181  181          0.8514516067533570196555001171e5,
 182  182          0.6617883658127083517939992166e5,
 183  183          0.1849426287322386679652009819e5,
 184  184          0.1706375429020768002061283546e4,
 185  185          0.3526513384663603218592175580e2,
 186  186          0.7087128194102874357377502472e6,       /* qs0 */
 187  187          0.1819458042243997298924553839e7,
 188  188          0.1419460669603720892855755253e7,
 189  189          0.4002944358226697511708610813e6,
 190  190          0.3789022974577220264142952256e5,
 191  191          0.8638367769604990967475517183e3,
 192  192  };
 193  193  
 194  194  #define pr0     Cj1y1
 195  195  #define ps0     (Cj1y1+6)
 196  196  #define qr0     (Cj1y1+12)
 197  197  #define qs0     (Cj1y1+18)
 198  198  
 199  199  static const double Cj1[] = {
 200  200          -6.250000000000002203053200981413218949548e-0002,       /* a0 */
 201  201          1.600998455640072901321605101981501263762e-0003,
 202  202          -1.963888815948313758552511884390162864930e-0005,
 203  203          8.263917341093549759781339713418201620998e-0008,
 204  204          1.0e0,                                                  /* b0 */
 205  205          1.605069137643004242395356851797873766927e-0002,
 206  206          1.149454623251299996428500249509098499383e-0004,
 207  207          3.849701673735260970379681807910852327825e-0007,
 208  208          4.999999999999999995517408894340485471724e-0001,
 209  209          -6.003825028120475684835384519945468075423e-0002,
 210  210          2.301719899263321828388344461995355419832e-0003,
 211  211          -4.208494869238892934859525221654040304068e-0005,
 212  212          4.377745135188837783031540029700282443388e-0007,
 213  213          -2.854106755678624335145364226735677754179e-0009,
 214  214          1.234002865443952024332943901323798413689e-0011,
 215  215          -3.645498437039791058951273508838177134310e-0014,
 216  216          7.404320596071797459925377103787837414422e-0017,
 217  217          -1.009457448277522275262808398517024439084e-0019,
 218  218          8.520158355824819796968771418801019930585e-0023,
 219  219          -3.458159926081163274483854614601091361424e-0026,
 220  220          1.0e0,                                                  /* b1 */
 221  221          4.923499437590484879081138588998986303306e-0003,
 222  222          1.054389489212184156499666953501976688452e-0005,
 223  223          1.180768373106166527048240364872043816050e-0008,
 224  224          5.942665743476099355323245707680648588540e-0012,
 225  225  };
 226  226  
 227  227  #define a0      Cj1
 228  228  #define b0      (Cj1+4)
 229  229  #define a1      (Cj1+8)
 230  230  #define b1      (Cj1+20)
 231  231  
 232  232  static const double Cy1[] = {
 233  233          -1.960570906462389461018983259589655961560e-0001,       /* c0 */
 234  234          4.931824118350661953459180060007970291139e-0002,
 235  235          -1.626975871565393656845930125424683008677e-0003,
 236  236          1.359657517926394132692884168082224258360e-0005,
 237  237          1.0e0,                                                  /* d0 */
 238  238          2.565807214838390835108224713630901653793e-0002,
 239  239          3.374175208978404268650522752520906231508e-0004,
 240  240          2.840368571306070719539936935220728843177e-0006,
 241  241          1.396387402048998277638900944415752207592e-0008,
 242  242          -1.960570906462389473336339614647555351626e-0001,       /* c1 */
 243  243          5.336268030335074494231369159933012844735e-0002,
 244  244          -2.684137504382748094149184541866332033280e-0003,
 245  245          5.737671618979185736981543498580051903060e-0005,
 246  246          -6.642696350686335339171171785557663224892e-0007,
 247  247          4.692417922568160354012347591960362101664e-0009,
 248  248          -2.161728635907789319335231338621412258355e-0011,
 249  249          6.727353419738316107197644431844194668702e-0014,
 250  250          -1.427502986803861372125234355906790573422e-0016,
 251  251          2.020392498726806769468143219616642940371e-0019,
 252  252          -1.761371948595104156753045457888272716340e-0022,
 253  253          7.352828391941157905175042420249225115816e-0026,
 254  254          1.0e0,                                                  /* d1 */
 255  255          5.029187436727947764916247076102283399442e-0003,
 256  256          1.102693095808242775074856548927801750627e-0005,
 257  257          1.268035774543174837829534603830227216291e-0008,
 258  258          6.579416271766610825192542295821308730206e-0012,
 259  259  };
 260  260  
 261  261  #define c0      Cy1
 262  262  #define d0      (Cy1+4)
 263  263  #define c1      (Cy1+9)
 264  264  #define d1      (Cy1+21)
 265  265  
 266  266  
 267  267  /* core of j0f computation; assumes fx is finite */
 268  268  static double
 269  269  __k_j0f(float fx)
 270  270  {
 271  271          double  x, z, s, c, ss, cc, r, t, p0, q0;
 272  272          int     ix, i;
 273  273  
 274  274          ix = *(int *)&fx & ~0x80000000;
 275  275          x = fabs((double)fx);
 276  276          if (ix > 0x41000000) {
 277  277                  /* x > 8; see comments in j0.c */
 278  278                  s = sin(x);
 279  279                  c = cos(x);
 280  280                  if (signbit(s) != signbit(c)) {
 281  281                          ss = s - c;
 282  282                          cc = -cos(x + x) / ss;
 283  283                  } else {
 284  284                          cc = s + c;
 285  285                          ss = -cos(x + x) / cc;
 286  286                  }
 287  287                  if (ix > 0x501502f9) {
 288  288                          /* x > 1.0e10 */
 289  289                          p0 = one;
 290  290                          q0 = neighth / x;
 291  291                  } else {
 292  292                          t = eight / x;
 293  293                          z = t * t;
 294  294                          p0 = (pr[0] + z * (pr[1] + z * (pr[2] + z * (pr[3] +
 295  295                              z * (pr[4] + z * (pr[5] + z * pr[6])))))) /
 296  296                              (ps[0] + z * (ps[1] + z * (ps[2] + z * (ps[3] +
 297  297                              z * (ps[4] + z * (ps[5] + z))))));
 298  298                          q0 = ((qr[0] + z * (qr[1] + z * (qr[2] + z * (qr[3] +
 299  299                              z * (qr[4] + z * (qr[5] + z * qr[6])))))) /
 300  300                              (qs[0] + z * (qs[1] + z * (qs[2] + z * (qs[3] +
 301  301                              z * (qs[4] + z * (qs[5] + z))))))) * t;
 302  302                  }
 303  303                  return (isqrtpi * (p0 * cc - q0 * ss) / sqrt(x));
 304  304          }
 305  305          if (ix <= 0x3727c5ac) {
 306  306                  /* x <= 1.0e-5 */
 307  307                  if (ix <= 0x219392ef) /* x <= 1.0e-18 */
 308  308                          return (one - x);
 309  309                  return (one - x * x * quarter);
 310  310          }
 311  311          z = x * x;
 312  312          if (ix <= 0x3fa3d70a) {
 313  313                  /* x <= 1.28 */
 314  314                  r = r0[0] + z * (r0[1] + z * (r0[2] + z * r0[3]));
 315  315                  s = s0[0] + z * (s0[1] + z * (s0[2] + z * s0[3]));
 316  316                  return (one + z * (r / s));
 317  317          }
 318  318          r = r1[8];
 319  319          s = s1[8];
 320  320          for (i = 7; i >= 0; i--) {
 321  321                  r = r * z + r1[i];
 322  322                  s = s * z + s1[i];
 323  323          }
 324  324          return (r / s);
 325  325  }
 326  326  
 327  327  float
 328  328  j0f(float fx)
 329  329  {
 330  330          float   f;
 331  331          int     ix;
 332  332  #if defined(__i386) && !defined(__amd64)
 333  333          int     rp;
 334  334  #endif
 335  335  
 336  336          ix = *(int *)&fx & ~0x80000000;
 337  337          if (ix >= 0x7f800000) {                 /* nan or inf */
 338  338                  if (ix > 0x7f800000)
 339  339                          return (fx * fx);
 340  340                  return (zerof);
 341  341          }
 342  342  
 343  343  #if defined(__i386) && !defined(__amd64)
 344  344          rp = __swapRP(fp_extended);
 345  345  #endif
 346  346          f = (float)__k_j0f(fx);
 347  347  #if defined(__i386) && !defined(__amd64)
 348  348          if (rp != fp_extended)
 349  349                  (void) __swapRP(rp);
 350  350  #endif
 351  351          return (f);
 352  352  }
 353  353  
 354  354  /* core of y0f computation; assumes fx is finite and positive */
 355  355  static double
 356  356  __k_y0f(float fx)
 357  357  {
 358  358          double  x, z, s, c, ss, cc, t, p0, q0, u, v;
 359  359          int     ix, i;
 360  360  
 361  361          ix = *(int *)&fx;
 362  362          x = (double)fx;
 363  363          if (ix > 0x41000000) {
 364  364                  /* x > 8; see comments in j0.c */
 365  365                  s = sin(x);
 366  366                  c = cos(x);
 367  367                  if (signbit(s) != signbit(c)) {
 368  368                          ss = s - c;
 369  369                          cc = -cos(x + x) / ss;
 370  370                  } else {
 371  371                          cc = s + c;
 372  372                          ss = -cos(x + x) / cc;
 373  373                  }
 374  374                  if (ix > 0x501502f9) {
 375  375                          /* x > 1.0e10 */
 376  376                          p0 = one;
 377  377                          q0 = neighth / x;
 378  378                  } else {
 379  379                          t = eight / x;
 380  380                          z = t * t;
 381  381                          p0 = (pr[0] + z * (pr[1] + z * (pr[2] + z * (pr[3] +
 382  382                              z * (pr[4] + z * (pr[5] + z * pr[6])))))) /
 383  383                              (ps[0] + z * (ps[1] + z * (ps[2] + z * (ps[3] +
 384  384                              z * (ps[4] + z * (ps[5] + z))))));
 385  385                          q0 = ((qr[0] + z * (qr[1] + z * (qr[2] + z * (qr[3] +
 386  386                              z * (qr[4] + z * (qr[5] + z * qr[6])))))) /
 387  387                              (qs[0] + z * (qs[1] + z * (qs[2] + z * (qs[3] +
 388  388                              z * (qs[4] + z * (qs[5] + z))))))) * t;
 389  389                  }
 390  390                  return (isqrtpi * (p0 * ss + q0 * cc) / sqrt(x));
 391  391          }
 392  392          if (ix <= 0x219392ef) /* x <= 1.0e-18 */
 393  393                  return (u0[0] + tpi * log(x));
 394  394          z = x * x;
 395  395          u = u0[12];
 396  396          for (i = 11; i >= 0; i--)
 397  397                  u = u * z + u0[i];
 398  398          v = v0[0] + z * (v0[1] + z * (v0[2] + z * (v0[3] + z * v0[4])));
 399  399          return (u / v + tpi * (__k_j0f(fx) * log(x)));
 400  400  }
 401  401  
 402  402  float
 403  403  y0f(float fx)
 404  404  {
 405  405          float   f;
 406  406          int     ix;
 407  407  #if defined(__i386) && !defined(__amd64)
 408  408          int     rp;
 409  409  #endif
 410  410  
 411  411          ix = *(int *)&fx;
 412  412          if ((ix & ~0x80000000) > 0x7f800000)    /* nan */
 413  413                  return (fx * fx);
 414  414          if (ix <= 0) {                          /* zero or negative */
 415  415                  if ((ix << 1) == 0)
 416  416                          return (-onef / zerof);
 417  417                  return (zerof / zerof);
 418  418          }
 419  419          if (ix == 0x7f800000)                   /* +inf */
 420  420                  return (zerof);
 421  421  
 422  422  #if defined(__i386) && !defined(__amd64)
 423  423          rp = __swapRP(fp_extended);
 424  424  #endif
 425  425          f = (float)__k_y0f(fx);
 426  426  #if defined(__i386) && !defined(__amd64)
 427  427          if (rp != fp_extended)
 428  428                  (void) __swapRP(rp);
 429  429  #endif
 430  430          return (f);
 431  431  }
 432  432  
 433  433  /* core of j1f computation; assumes fx is finite */
 434  434  static double
 435  435  __k_j1f(float fx)
 436  436  {
 437  437          double  x, z, s, c, ss, cc, r, t, p1, q1;
 438  438          int     i, ix, sgn;
 439  439  
 440  440          ix = *(int *)&fx;
 441  441          sgn = (unsigned)ix >> 31;
 442  442          ix &= ~0x80000000;
 443  443          x = fabs((double)fx);
 444  444          if (ix > 0x41000000) {
 445  445                  /* x > 8; see comments in j1.c */
 446  446                  s = sin(x);
 447  447                  c = cos(x);
 448  448                  if (signbit(s) != signbit(c)) {
 449  449                          cc = s - c;
 450  450                          ss = cos(x + x) / cc;
 451  451                  } else {
 452  452                          ss = -s - c;
 453  453                          cc = cos(x + x) / ss;
 454  454                  }
 455  455                  if (ix > 0x501502f9) {
 456  456                          /* x > 1.0e10 */
 457  457                          p1 = one;
 458  458                          q1 = three8 / x;
 459  459                  } else {
 460  460                          t = eight / x;
 461  461                          z = t * t;
 462  462                          p1 = (pr0[0] + z * (pr0[1] + z * (pr0[2] + z *
 463  463                              (pr0[3] + z * (pr0[4] + z * pr0[5]))))) /
 464  464                              (ps0[0] + z * (ps0[1] + z * (ps0[2] + z *
 465  465                              (ps0[3] + z * (ps0[4] + z * (ps0[5] + z))))));
 466  466                          q1 = ((qr0[0] + z * (qr0[1] + z * (qr0[2] + z *
 467  467                              (qr0[3] + z * (qr0[4] + z * qr0[5]))))) /
 468  468                              (qs0[0] + z * (qs0[1] + z * (qs0[2] + z *
 469  469                              (qs0[3] + z * (qs0[4] + z * (qs0[5] + z))))))) * t;
 470  470                  }
 471  471                  t = isqrtpi * (p1 * cc - q1 * ss) / sqrt(x);
 472  472                  return ((sgn)? -t : t);
 473  473          }
 474  474          if (ix <= 0x3727c5ac) {
 475  475                  /* x <= 1.0e-5 */
 476  476                  if (ix <= 0x219392ef) /* x <= 1.0e-18 */
 477  477                          t = half * x;
 478  478                  else
 479  479                          t = x * (half + neighth * x * x);
 480  480                  return ((sgn)? -t : t);
 481  481          }
 482  482          z = x * x;
 483  483          if (ix < 0x3fa3d70a) {
 484  484                  /* x < 1.28 */
 485  485                  r = a0[0] + z * (a0[1] + z * (a0[2] + z * a0[3]));
 486  486                  s = b0[0] + z * (b0[1] + z * (b0[2] + z * b0[3]));
 487  487                  t = x * half + x * (z * (r / s));
 488  488          } else {
 489  489                  r = a1[11];
 490  490                  for (i = 10; i >= 0; i--)
 491  491                          r = r * z + a1[i];
 492  492                  s = b1[0] + z * (b1[1] + z * (b1[2] + z * (b1[3] + z * b1[4])));
 493  493                  t = x * (r / s);
 494  494          }
 495  495          return ((sgn)? -t : t);
 496  496  }
 497  497  
 498  498  float
 499  499  j1f(float fx)
 500  500  {
 501  501          float   f;
 502  502          int     ix;
 503  503  #if defined(__i386) && !defined(__amd64)
 504  504          int     rp;
 505  505  #endif
 506  506  
 507  507          ix = *(int *)&fx & ~0x80000000;
 508  508          if (ix >= 0x7f800000)                   /* nan or inf */
 509  509                  return (onef / fx);
 510  510  
 511  511  #if defined(__i386) && !defined(__amd64)
 512  512          rp = __swapRP(fp_extended);
 513  513  #endif
 514  514          f = (float)__k_j1f(fx);
 515  515  #if defined(__i386) && !defined(__amd64)
 516  516          if (rp != fp_extended)
 517  517                  (void) __swapRP(rp);
 518  518  #endif
 519  519          return (f);
 520  520  }
 521  521  
 522  522  /* core of y1f computation; assumes fx is finite and positive */
 523  523  static double
 524  524  __k_y1f(float fx)
 525  525  {
 526  526          double  x, z, s, c, ss, cc, u, v, p1, q1, t;
 527  527          int     i, ix;
 528  528  
 529  529          ix = *(int *)&fx;
 530  530          x = (double)fx;
 531  531          if (ix > 0x41000000) {
 532  532                  /* x > 8; see comments in j1.c */
 533  533                  s = sin(x);
 534  534                  c = cos(x);
 535  535                  if (signbit(s) != signbit(c)) {
 536  536                          cc = s - c;
 537  537                          ss = cos(x + x) / cc;
 538  538                  } else {
 539  539                          ss = -s - c;
 540  540                          cc = cos(x + x) / ss;
 541  541                  }
 542  542                  if (ix > 0x501502f9) {
 543  543                          /* x > 1.0e10 */
 544  544                          p1 = one;
 545  545                          q1 = three8 / x;
 546  546                  } else {
 547  547                          t = eight / x;
 548  548                          z = t * t;
 549  549                          p1 = (pr0[0] + z * (pr0[1] + z * (pr0[2] + z *
 550  550                              (pr0[3] + z * (pr0[4] + z * pr0[5]))))) /
 551  551                              (ps0[0] + z * (ps0[1] + z * (ps0[2] + z *
 552  552                              (ps0[3] + z * (ps0[4] + z * (ps0[5] + z))))));
 553  553                          q1 = ((qr0[0] + z * (qr0[1] + z * (qr0[2] + z *
 554  554                              (qr0[3] + z * (qr0[4] + z * qr0[5]))))) /
 555  555                              (qs0[0] + z * (qs0[1] + z * (qs0[2] + z *
 556  556                              (qs0[3] + z * (qs0[4] + z * (qs0[5] + z))))))) * t;
 557  557                  }
 558  558                  return (isqrtpi * (p1 * ss + q1 * cc) / sqrt(x));
 559  559          }
 560  560          if (ix <= 0x219392ef) /* x <= 1.0e-18 */
 561  561                  return (-tpi / x);
 562  562          z = x * x;
 563  563          if (ix < 0x3fa3d70a) {
 564  564                  /* x < 1.28 */
 565  565                  u = c0[0] + z * (c0[1] + z * (c0[2] + z * c0[3]));
 566  566                  v = d0[0] + z * (d0[1] + z * (d0[2] + z * (d0[3] + z * d0[4])));
 567  567          } else {
 568  568                  u = c1[11];
 569  569                  for (i = 10; i >= 0; i--)
 570  570                          u = u * z + c1[i];
 571  571                  v = d1[0] + z * (d1[1] + z * (d1[2] + z * (d1[3] + z * d1[4])));
 572  572          }
 573  573          return (x * (u / v) + tpi * (__k_j1f(fx) * log(x) - one / x));
 574  574  }
 575  575  
 576  576  float
 577  577  y1f(float fx)
 578  578  {
 579  579          float   f;
 580  580          int     ix;
 581  581  #if defined(__i386) && !defined(__amd64)
 582  582          int     rp;
 583  583  #endif
 584  584  
 585  585          ix = *(int *)&fx;
 586  586          if ((ix & ~0x80000000) > 0x7f800000)    /* nan */
 587  587                  return (fx * fx);
 588  588          if (ix <= 0) {                          /* zero or negative */
 589  589                  if ((ix << 1) == 0)
 590  590                          return (-onef / zerof);
 591  591                  return (zerof / zerof);
 592  592          }
 593  593          if (ix == 0x7f800000)                   /* +inf */
 594  594                  return (zerof);
 595  595  
 596  596  #if defined(__i386) && !defined(__amd64)
 597  597          rp = __swapRP(fp_extended);
 598  598  #endif
 599  599          f = (float)__k_y1f(fx);
 600  600  #if defined(__i386) && !defined(__amd64)
 601  601          if (rp != fp_extended)
 602  602                  (void) __swapRP(rp);
 603  603  #endif
 604  604          return (f);
 605  605  }
 606  606  
 607  607  float
 608  608  jnf(int n, float fx)
 609  609  {
 610  610          double  a, b, temp, x, z, w, t, q0, q1, h;
 611  611          float   f;
 612  612          int     i, ix, sgn, m, k;
 613  613  #if defined(__i386) && !defined(__amd64)
 614  614          int     rp;
 615  615  #endif
 616  616  
 617  617          if (n < 0) {
 618  618                  n = -n;
 619  619                  fx = -fx;
 620  620          }
 621  621          if (n == 0)
 622  622                  return (j0f(fx));
 623  623          if (n == 1)
 624  624                  return (j1f(fx));
 625  625  
 626  626          ix = *(int *)&fx;
 627  627          sgn = (n & 1)? ((unsigned)ix >> 31) : 0;
 628  628          ix &= ~0x80000000;
 629  629          if (ix >= 0x7f800000) {         /* nan or inf */
 630  630                  if (ix > 0x7f800000)
 631  631                          return (fx * fx);
 632  632                  return ((sgn)? -zerof : zerof);
 633  633          }
 634  634          if ((ix << 1) == 0)
 635  635                  return ((sgn)? -zerof : zerof);
 636  636  
 637  637  #if defined(__i386) && !defined(__amd64)
 638  638          rp = __swapRP(fp_extended);
 639  639  #endif
 640  640          fx = fabsf(fx);
 641  641          x = (double)fx;
 642  642          if ((double)n <= x) {
 643  643                  /* safe to use J(n+1,x) = 2n/x * J(n,x) - J(n-1,x) */
 644  644                  a = __k_j0f(fx);
 645  645                  b = __k_j1f(fx);
 646  646                  for (i = 1; i < n; i++) {
 647  647                          temp = b;
 648  648                          b = b * ((double)(i + i) / x) - a;
 649  649                          a = temp;
 650  650                  }
 651  651                  f = (float)b;
 652  652  #if defined(__i386) && !defined(__amd64)
 653  653                  if (rp != fp_extended)
 654  654                          (void) __swapRP(rp);
 655  655  #endif
 656  656                  return ((sgn)? -f : f);
 657  657          }
 658  658          if (ix < 0x3089705f) {
 659  659                  /* x < 1.0e-9; use J(n,x) = 1/n! * (x / 2)^n */
 660  660                  if (n > 6)
 661  661                          n = 6;  /* result underflows to zero for n >= 6 */
 662  662                  b = t = half * x;
 663  663                  a = one;
 664  664                  for (i = 2; i <= n; i++) {
 665  665                          b *= t;
 666  666                          a *= (double)i;
 667  667                  }
 668  668                  b /= a;
 669  669          } else {
 670  670                  /*
 671  671                   * Use the backward recurrence:
 672  672                   *
 673  673                   *                      x      x^2      x^2
 674  674                   *  J(n,x)/J(n-1,x) =  ---- - ------ - ------   .....
 675  675                   *                      2n    2(n+1)   2(n+2)
 676  676                   *
 677  677                   * Let w = 2n/x and h = 2/x.  Then the above quotient
 678  678                   * is equal to the continued fraction:
 679  679                   *                   1
 680  680                   *      = -----------------------
 681  681                   *                      1
 682  682                   *         w - -----------------
 683  683                   *                        1
 684  684                   *              w+h - ---------
 685  685                   *                      w+2h - ...
 686  686                   *
 687  687                   * To determine how many terms are needed, run the
 688  688                   * recurrence
 689  689                   *
 690  690                   *      Q(0) = w,
 691  691                   *      Q(1) = w(w+h) - 1,
 692  692                   *      Q(k) = (w+k*h)*Q(k-1) - Q(k-2).
 693  693                   *
 694  694                   * Then when Q(k) > 1e4, k is large enough for single
 695  695                   * precision.
 696  696                   */
 697  697  /* XXX NOT DONE - rework this */
 698  698                  w = (n + n) / x;
 699  699                  h = two / x;
 700  700                  q0 = w;
 701  701                  z = w + h;
 702  702                  q1 = w * z - one;
 703  703                  k = 1;
 704  704                  while (q1 < big) {
 705  705                          k++;
 706  706                          z += h;
 707  707                          temp = z * q1 - q0;
 708  708                          q0 = q1;
 709  709                          q1 = temp;
 710  710                  }
 711  711                  m = n + n;
 712  712                  t = zero;
 713  713                  for (i = (n + k) << 1; i >= m; i -= 2)
 714  714                          t = one / ((double)i / x - t);
 715  715                  a = t;
 716  716                  b = one;
 717  717                  /*
 718  718                   * estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
 719  719                   * hence, if n*(log(2n/x)) > ...
 720  720                   *      single 8.8722839355e+01
 721  721                   *      double 7.09782712893383973096e+02
 722  722                   *      then recurrent value may overflow and the result is
 723  723                   *      likely underflow to zero
 724  724                   */
 725  725                  temp = (double)n;
 726  726                  temp *= log((two / x) * temp);
 727  727                  if (temp < 7.09782712893383973096e+02) {
 728  728                          for (i = n - 1; i > 0; i--) {
 729  729                                  temp = b;
 730  730                                  b = b * ((double)(i + i) / x) - a;
 731  731                                  a = temp;
 732  732                          }
 733  733                  } else {
 734  734                          for (i = n - 1; i > 0; i--) {
 735  735                                  temp = b;
 736  736                                  b = b * ((double)(i + i) / x) - a;
 737  737                                  a = temp;
 738  738                                  if (b > 1.0e100) {
 739  739                                          a /= b;
 740  740                                          t /= b;
 741  741                                          b = one;
 742  742                                  }
 743  743                          }
 744  744                  }
 745  745                  b = (t * __k_j0f(fx) / b);
 746  746          }
 747  747          f = (float)b;
 748  748  #if defined(__i386) && !defined(__amd64)
 749  749          if (rp != fp_extended)
 750  750                  (void) __swapRP(rp);
 751  751  #endif
 752  752          return ((sgn)? -f : f);
 753  753  }
 754  754  
 755  755  float
 756  756  ynf(int n, float fx)
 757  757  {
 758  758          double  a, b, temp, x;
 759  759          float   f;
 760  760          int     i, sign, ix;
 761  761  #if defined(__i386) && !defined(__amd64)
 762  762          int     rp;
 763  763  #endif
 764  764  
 765  765          sign = 0;
 766  766          if (n < 0) {
 767  767                  n = -n;
 768  768                  if (n & 1)
 769  769                          sign = 1;
 770  770          }
 771  771          if (n == 0)
 772  772                  return (y0f(fx));
 773  773          if (n == 1)
 774  774                  return ((sign)? -y1f(fx) : y1f(fx));
 775  775  
 776  776          ix = *(int *)&fx;
 777  777          if ((ix & ~0x80000000) > 0x7f800000)    /* nan */
 778  778                  return (fx * fx);
 779  779          if (ix <= 0) {                          /* zero or negative */
 780  780                  if ((ix << 1) == 0)
 781  781                          return (-onef / zerof);
 782  782                  return (zerof / zerof);
 783  783          }
 784  784          if (ix == 0x7f800000)                   /* +inf */
 785  785                  return (zerof);
 786  786  
 787  787  #if defined(__i386) && !defined(__amd64)
 788  788          rp = __swapRP(fp_extended);
 789  789  #endif
 790  790          a = __k_y0f(fx);
 791  791          b = __k_y1f(fx);
 792  792          x = (double)fx;
 793  793          for (i = 1; i < n; i++) {
 794  794                  temp = b;
 795  795                  b *= (double)(i + i) / x;
 796  796                  if (b <= -DBL_MAX)
 797  797                          break;
 798  798                  b -= a;
 799  799                  a = temp;
 800  800          }
 801  801          f = (float)b;
 802  802  #if defined(__i386) && !defined(__amd64)
 803  803          if (rp != fp_extended)
 804  804                  (void) __swapRP(rp);
 805  805  #endif
 806  806          return ((sign)? -f : f);
 807  807  }
  
    | 
      ↓ open down ↓ | 
    763 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX