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

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libm/common/Q/jnl.c
          +++ new/usr/src/lib/libm/common/Q/jnl.c
↓ open down ↓ 14 lines elided ↑ open up ↑
  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   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  24   24   */
       25 +
  25   26  /*
  26   27   * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  27   28   * Use is subject to license terms.
  28   29   */
  29   30  
  30   31  #pragma weak __jnl = jnl
  31   32  #pragma weak __ynl = ynl
  32   33  
  33   34  /*
  34   35   * floating point Bessel's function of the 1st and 2nd kind
↓ open down ↓ 15 lines elided ↑ open up ↑
  50   51   *      supposed value of j(n,x).
  51   52   *
  52   53   *      yn(n,x) is similar in all respects, except
  53   54   *      that forward recursion is used for all
  54   55   *      values of n>1.
  55   56   *
  56   57   */
  57   58  
  58   59  #include "libm.h"
  59   60  #include "longdouble.h"
  60      -#include <float.h>      /* LDBL_MAX */
       61 +#include <float.h>                      /* LDBL_MAX */
  61   62  
  62      -#define GENERIC long double
       63 +#define GENERIC long double
  63   64  
  64   65  static const GENERIC
  65      -invsqrtpi = 5.641895835477562869480794515607725858441e-0001L,
  66      -two  = 2.0L,
  67      -zero = 0.0L,
  68      -one  = 1.0L;
       66 +        invsqrtpi = 5.641895835477562869480794515607725858441e-0001L,
       67 +        two = 2.0L,
       68 +        zero = 0.0L,
       69 +        one = 1.0L;
  69   70  
  70   71  GENERIC
  71   72  jnl(int n, GENERIC x)
  72   73  {
  73   74          int i, sgn;
  74   75          GENERIC a, b, temp, z, w;
  75   76  
  76   77          /*
  77   78           * J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x)
  78   79           * Thus, J(-n,x) = J(n,-x)
  79   80           */
  80   81          if (n < 0) {
  81   82                  n = -n;
  82   83                  x = -x;
  83   84          }
       85 +
  84   86          if (n == 0)
  85   87                  return (j0l(x));
       88 +
  86   89          if (n == 1)
  87   90                  return (j1l(x));
       91 +
  88   92          if (x != x)
  89      -                return (x+x);
  90      -        if ((n&1) == 0)
  91      -                sgn = 0;                        /* even n */
       93 +                return (x + x);
       94 +
       95 +        if ((n & 1) == 0)
       96 +                sgn = 0;                /* even n */
  92   97          else
  93   98                  sgn = signbitl(x);      /* old n  */
       99 +
  94  100          x = fabsl(x);
  95      -        if (x == zero || !finitel(x)) b = zero;
  96      -        else if ((GENERIC)n <= x) {
  97      -                                        /*
  98      -                                         * Safe to use
  99      -                                         * J(n+1,x)=2n/x *J(n,x)-J(n-1,x)
 100      -                                         */
      101 +
      102 +        if (x == zero || !finitel(x)) {
      103 +                b = zero;
      104 +        } else if ((GENERIC)n <= x) {
      105 +                /*
      106 +                 * Safe to use
      107 +                 * J(n+1,x)=2n/x *J(n,x)-J(n-1,x)
      108 +                 */
 101  109                  if (x > 1.0e91L) {
 102      -                                /*
 103      -                                 * x >> n**2
 104      -                                 *  Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
 105      -                                 *   Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
 106      -                                 *   Let s=sin(x), c=cos(x),
 107      -                                 *      xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
 108      -                                 *
 109      -                                 *         n    sin(xn)*sqt2    cos(xn)*sqt2
 110      -                                 *      ----------------------------------
 111      -                                 *         0     s-c             c+s
 112      -                                 *         1    -s-c            -c+s
 113      -                                 *         2    -s+c            -c-s
 114      -                                 *         3     s+c             c-s
 115      -                                 */
 116      -                        switch (n&3) {
      110 +                        /*
      111 +                         * x >> n**2
      112 +                         *  Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
      113 +                         *   Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
      114 +                         *   Let s=sin(x), c=cos(x),
      115 +                         *      xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
      116 +                         *
      117 +                         *         n    sin(xn)*sqt2    cos(xn)*sqt2
      118 +                         *      ----------------------------------
      119 +                         *         0     s-c             c+s
      120 +                         *         1    -s-c            -c+s
      121 +                         *         2    -s+c            -c-s
      122 +                         *         3     s+c             c-s
      123 +                         */
      124 +                        switch (n & 3) {
 117  125                          case 0:
 118      -                                temp =  cosl(x)+sinl(x);
      126 +                                temp = cosl(x) + sinl(x);
 119  127                                  break;
 120  128                          case 1:
 121      -                                temp = -cosl(x)+sinl(x);
      129 +                                temp = -cosl(x) + sinl(x);
 122  130                                  break;
 123  131                          case 2:
 124      -                                temp = -cosl(x)-sinl(x);
      132 +                                temp = -cosl(x) - sinl(x);
 125  133                                  break;
 126  134                          case 3:
 127      -                                temp =  cosl(x)-sinl(x);
      135 +                                temp = cosl(x) - sinl(x);
 128  136                                  break;
 129  137                          }
 130      -                        b = invsqrtpi*temp/sqrtl(x);
      138 +
      139 +                        b = invsqrtpi * temp / sqrtl(x);
 131  140                  } else {
 132  141                          a = j0l(x);
 133  142                          b = j1l(x);
      143 +
 134  144                          for (i = 1; i < n; i++) {
 135  145                                  temp = b;
 136  146                                  /* avoid underflow */
 137      -                                b = b*((GENERIC)(i+i)/x) - a;
      147 +                                b = b * ((GENERIC)(i + i) / x) - a;
 138  148                                  a = temp;
 139  149                          }
 140  150                  }
 141  151          } else {
 142  152                  if (x < 1e-17L) {       /* use J(n,x) = 1/n!*(x/2)^n */
 143      -                        b = powl(0.5L*x, (GENERIC)n);
      153 +                        b = powl(0.5L * x, (GENERIC)n);
      154 +
 144  155                          if (b != zero) {
 145  156                                  for (a = one, i = 1; i <= n; i++)
 146  157                                          a *= (GENERIC)i;
 147      -                                b = b/a;
      158 +
      159 +                                b = b / a;
 148  160                          }
 149  161                  } else {
 150  162                          /* use backward recurrence */
 151  163                          /* BEGIN CSTYLED */
 152  164                          /*
 153  165                           *                      x      x^2      x^2
 154  166                           *  J(n,x)/J(n-1,x) =  ----   ------   ------   .....
 155  167                           *                      2n  - 2(n+1) - 2(n+2)
 156  168                           *
 157  169                           *                      1      1        1
↓ open down ↓ 17 lines elided ↑ open up ↑
 175  187                           * Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
 176  188                           * When Q(k) > 1e4      good for single
 177  189                           * When Q(k) > 1e9      good for double
 178  190                           * When Q(k) > 1e17     good for quaduple
 179  191                           */
 180  192                          /* END CSTYLED */
 181  193                          /* determine k */
 182  194                          GENERIC t, v;
 183  195                          double q0, q1, h, tmp;
 184  196                          int k, m;
 185      -                        w  = (n+n)/(double)x;
 186      -                        h = 2.0/(double)x;
      197 +
      198 +                        w = (n + n) / (double)x;
      199 +                        h = 2.0 / (double)x;
 187  200                          q0 = w;
 188      -                        z = w+h;
 189      -                        q1 = w*z - 1.0;
      201 +                        z = w + h;
      202 +                        q1 = w * z - 1.0;
 190  203                          k = 1;
      204 +
 191  205                          while (q1 < 1.0e17) {
 192  206                                  k += 1;
 193  207                                  z += h;
 194      -                                tmp = z*q1 - q0;
      208 +                                tmp = z * q1 - q0;
 195  209                                  q0 = q1;
 196  210                                  q1 = tmp;
 197  211                          }
 198      -                        m = n+n;
 199      -                        for (t = zero, i = 2*(n+k); i >= m; i -= 2)
 200      -                                t = one/(i/x-t);
      212 +
      213 +                        m = n + n;
      214 +
      215 +                        for (t = zero, i = 2 * (n + k); i >= m; i -= 2)
      216 +                                t = one / (i / x - t);
      217 +
 201  218                          a = t;
 202  219                          b = one;
      220 +
 203  221                          /*
 204  222                           * estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
 205  223                           * hence, if n*(log(2n/x)) > ...
 206  224                           *  single:
 207  225                           *    8.8722839355e+01
 208  226                           *  double:
 209  227                           *    7.09782712893383973096e+02
 210  228                           *  long double:
 211  229                           *    1.1356523406294143949491931077970765006170e+04
 212  230                           *  then recurrent value may overflow and the result is
 213  231                           *  likely underflow to zero
 214  232                           */
 215  233                          tmp = n;
 216      -                        v = two/x;
 217      -                        tmp = tmp*logl(fabsl(v*tmp));
      234 +                        v = two / x;
      235 +                        tmp = tmp * logl(fabsl(v * tmp));
      236 +
 218  237                          if (tmp < 1.1356523406294143949491931077970765e+04L) {
 219      -                                for (i = n-1; i > 0; i--) {
      238 +                                for (i = n - 1; i > 0; i--) {
 220  239                                          temp = b;
 221      -                                        b = ((i+i)/x)*b - a;
      240 +                                        b = ((i + i) / x) * b - a;
 222  241                                          a = temp;
 223  242                                  }
 224  243                          } else {
 225      -                                for (i = n-1; i > 0; i--) {
      244 +                                for (i = n - 1; i > 0; i--) {
 226  245                                          temp = b;
 227      -                                        b = ((i+i)/x)*b - a;
      246 +                                        b = ((i + i) / x) * b - a;
 228  247                                          a = temp;
      248 +
 229  249                                          if (b > 1e1000L) {
 230  250                                                  a /= b;
 231  251                                                  t /= b;
 232      -                                                b  = 1.0;
      252 +                                                b = 1.0;
 233  253                                          }
 234  254                                  }
 235  255                          }
 236      -                        b = (t*j0l(x)/b);
      256 +
      257 +                        b = (t * j0l(x) / b);
 237  258                  }
 238  259          }
      260 +
 239  261          if (sgn != 0)
 240  262                  return (-b);
 241  263          else
 242  264                  return (b);
 243  265  }
 244  266  
 245  267  GENERIC
 246  268  ynl(int n, GENERIC x)
 247  269  {
 248  270          int i;
 249  271          int sign;
 250  272          GENERIC a, b, temp;
 251  273  
 252  274          if (x != x)
 253      -                return (x+x);
      275 +                return (x + x);
      276 +
 254  277          if (x <= zero) {
 255  278                  if (x == zero)
 256      -                        return (-one/zero);
      279 +                        return (-one / zero);
 257  280                  else
 258      -                        return (zero/zero);
      281 +                        return (zero / zero);
 259  282          }
      283 +
 260  284          sign = 1;
      285 +
 261  286          if (n < 0) {
 262  287                  n = -n;
 263      -                if ((n&1) == 1) sign = -1;
      288 +
      289 +                if ((n & 1) == 1)
      290 +                        sign = -1;
 264  291          }
      292 +
 265  293          if (n == 0)
 266  294                  return (y0l(x));
      295 +
 267  296          if (n == 1)
 268      -                return (sign*y1l(x));
      297 +                return (sign * y1l(x));
      298 +
 269  299          if (!finitel(x))
 270  300                  return (zero);
 271  301  
 272  302          if (x > 1.0e91L) {
 273  303                  /*
 274  304                   * x >> n**2
 275  305                   *   Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
 276  306                   *   Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
 277  307                   *   Let s = sin(x), c = cos(x),
 278  308                   *      xn = x-(2n+1)*pi/4, sqt2 = sqrt(2), then
 279  309                   *
 280  310                   *         n    sin(xn)*sqt2    cos(xn)*sqt2
 281  311                   *      ----------------------------------
 282  312                   *         0     s-c             c+s
 283  313                   *         1    -s-c            -c+s
 284  314                   *         2    -s+c            -c-s
 285  315                   *         3     s+c             c-s
 286  316                   */
 287      -                switch (n&3) {
      317 +                switch (n & 3) {
 288  318                  case 0:
 289      -                        temp =  sinl(x)-cosl(x);
      319 +                        temp = sinl(x) - cosl(x);
 290  320                          break;
 291  321                  case 1:
 292      -                        temp = -sinl(x)-cosl(x);
      322 +                        temp = -sinl(x) - cosl(x);
 293  323                          break;
 294  324                  case 2:
 295      -                        temp = -sinl(x)+cosl(x);
      325 +                        temp = -sinl(x) + cosl(x);
 296  326                          break;
 297  327                  case 3:
 298      -                        temp =  sinl(x)+cosl(x);
      328 +                        temp = sinl(x) + cosl(x);
 299  329                          break;
 300  330                  }
 301      -                b = invsqrtpi*temp/sqrtl(x);
      331 +
      332 +                b = invsqrtpi * temp / sqrtl(x);
 302  333          } else {
 303  334                  a = y0l(x);
 304  335                  b = y1l(x);
      336 +
 305  337                  /*
 306  338                   * fix 1262058 and take care of non-default rounding
 307  339                   */
 308  340                  for (i = 1; i < n; i++) {
 309  341                          temp = b;
 310      -                        b *= (GENERIC) (i + i) / x;
      342 +                        b *= (GENERIC)(i + i) / x;
      343 +
 311  344                          if (b <= -LDBL_MAX)
 312  345                                  break;
      346 +
 313  347                          b -= a;
 314  348                          a = temp;
 315  349                  }
 316  350          }
      351 +
 317  352          if (sign > 0)
 318  353                  return (b);
 319  354          else
 320  355                  return (-b);
 321  356  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX