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

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libm/common/complex/cpowl.c
          +++ new/usr/src/lib/libm/common/complex/cpowl.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 __cpowl = cpowl
  31   32  
  32      -#include "libm.h"                               /* __k_clog_rl/__k_atan2l */
       33 +#include "libm.h"                       /* __k_clog_rl/__k_atan2l */
  33   34  /* atan2l/atan2pil/exp2l/expl/fabsl/hypotl/isinfl/logl/powl/sincosl/sincospil */
  34   35  #include "complex_wrapper.h"
  35   36  #include "longdouble.h"
  36   37  
  37   38  #if defined(__sparc)
  38      -#define HALF(x)  ((int *) &x)[3] = 0; ((int *) &x)[2] &= 0xfe000000
  39      -#define LAST(x)  ((int *) &x)[3]
       39 +#define HALF(x)         ((int *)&x)[3] = 0; ((int *)&x)[2] &= 0xfe000000
       40 +#define LAST(x)         ((int *)&x)[3]
  40   41  #elif defined(__x86)
  41      -#define HALF(x)  ((int *) &x)[0] = 0
  42      -#define LAST(x)  ((int *) &x)[0]
       42 +#define HALF(x)         ((int *)&x)[0] = 0
       43 +#define LAST(x)         ((int *)&x)[0]
  43   44  #endif
  44   45  
  45      -/* INDENT OFF */
  46   46  static const int hiinf = 0x7fff0000;
  47      -static const long double
  48      -        tiny = 1.0e-4000L,
       47 +static const long double tiny = 1.0e-4000L,
  49   48          huge = 1.0e4000L,
  50   49  #if defined(__x86)
  51      -                /* 43 significant bits, 21 trailing zeros */
       50 +/* 43 significant bits, 21 trailing zeros */
  52   51          ln2hil = 0.693147180559890330187045037746429443359375L,
  53   52          ln2lol = 5.497923018708371174712471612513436025525412068e-14L,
  54      -#else   /* sparc */
  55      -                /* 0x3FF962E4 2FEFA39E F35793C7 00000000 */
       53 +#else /* sparc */
       54 +/* 0x3FF962E4 2FEFA39E F35793C7 00000000 */
  56   55          ln2hil = 0.693147180559945309417231592858066493070671489074L,
  57   56          ln2lol = 5.28600110075004828645286235820646730106802446566153e-25L,
  58   57  #endif
  59      -        invln2  = 1.442695040888963407359924681001892137427e+0000L,
       58 +        invln2 = 1.442695040888963407359924681001892137427e+0000L,
  60   59          one = 1.0L,
  61   60          zero = 0.0L;
  62      -/* INDENT ON */
  63   61  
  64   62  /*
  65   63   * Assuming |t[0]| > |t[1]| and |t[2]| > |t[3]|, sum4fpl subroutine
  66   64   * compute t[0] + t[1] + t[2] + t[3] into two long double fp numbers.
  67   65   */
  68      -static long double sum4fpl(long double ta[], long double *w)
       66 +static long double
       67 +sum4fpl(long double ta[], long double *w)
  69   68  {
  70   69          long double t1, t2, t3, t4, w1, w2, t;
  71      -        t1 = ta[0]; t2 = ta[1]; t3 = ta[2]; t4 = ta[3];
       70 +
       71 +        t1 = ta[0];
       72 +        t2 = ta[1];
       73 +        t3 = ta[2];
       74 +        t4 = ta[3];
       75 +
  72   76          /*
  73   77           * Rearrange ti so that |t1| >= |t2| >= |t3| >= |t4|
  74   78           */
  75   79          if (fabsl(t4) > fabsl(t1)) {
  76      -                t = t1; t1 = t3; t3 = t;
  77      -                t = t2; t2 = t4; t4 = t;
       80 +                t = t1;
       81 +                t1 = t3;
       82 +                t3 = t;
       83 +                t = t2;
       84 +                t2 = t4;
       85 +                t4 = t;
  78   86          } else if (fabsl(t3) > fabsl(t1)) {
  79      -                t = t1; t1 = t3;
       87 +                t = t1;
       88 +                t1 = t3;
       89 +
  80   90                  if (fabsl(t4) > fabsl(t2)) {
  81      -                        t3 = t4; t4 = t2; t2 = t;
       91 +                        t3 = t4;
       92 +                        t4 = t2;
       93 +                        t2 = t;
  82   94                  } else {
  83      -                        t3 = t2; t2 = t;
       95 +                        t3 = t2;
       96 +                        t2 = t;
  84   97                  }
  85   98          } else if (fabsl(t3) > fabsl(t2)) {
  86      -                t = t2; t2 = t3;
       99 +                t = t2;
      100 +                t2 = t3;
      101 +
  87  102                  if (fabsl(t4) > fabsl(t2)) {
  88      -                        t3 = t4; t4 = t;
  89      -                } else
      103 +                        t3 = t4;
      104 +                        t4 = t;
      105 +                } else {
  90  106                          t3 = t;
      107 +                }
  91  108          }
      109 +
  92  110          /* summing r = t1 + t2 + t3 + t4 to w1 + w2 */
  93  111          w1 = t3 + t4;
  94  112          w2 = t4 - (w1 - t3);
  95      -        t  = t2 + w1;
      113 +        t = t2 + w1;
  96  114          w2 += w1 - (t - t2);
  97  115          w1 = t + w2;
  98  116          w2 += t - w1;
  99      -        t  = t1 + w1;
      117 +        t = t1 + w1;
 100  118          w2 += w1 - (t - t1);
 101  119          w1 = t + w2;
 102  120          *w = w2 - (w1 - t);
 103  121          return (w1);
 104  122  }
 105  123  
 106  124  ldcomplex
 107      -cpowl(ldcomplex z, ldcomplex w) {
      125 +cpowl(ldcomplex z, ldcomplex w)
      126 +{
 108  127          ldcomplex ans;
 109  128          long double x, y, u, v, t, c, s, r;
 110  129          long double t1, t2, t3, t4, x1, x2, y1, y2, u1, v1, b[4], w1, w2;
 111  130          int ix, iy, hx, hy, hv, hu, iu, iv, i, j, k;
 112  131  
 113  132          x = LD_RE(z);
 114  133          y = LD_IM(z);
 115  134          u = LD_RE(w);
 116  135          v = LD_IM(w);
 117  136          hx = HI_XWORD(x);
 118  137          hy = HI_XWORD(y);
 119  138          hu = HI_XWORD(u);
 120  139          hv = HI_XWORD(v);
 121  140          ix = hx & 0x7fffffff;
 122  141          iy = hy & 0x7fffffff;
 123  142          iu = hu & 0x7fffffff;
 124  143          iv = hv & 0x7fffffff;
 125  144  
 126  145          j = 0;
 127      -        if (v == zero) {        /* z**(real) */
 128      -                if (u == one) { /* (anything) ** 1  is itself */
      146 +
      147 +        if (v == zero) {                /* z**(real) */
      148 +                if (u == one) {         /* (anything) ** 1  is itself */
 129  149                          LD_RE(ans) = x;
 130  150                          LD_IM(ans) = y;
 131  151                  } else if (u == zero) { /* (anything) ** 0  is 1 */
 132  152                          LD_RE(ans) = one;
 133  153                          LD_IM(ans) = zero;
 134  154                  } else if (y == zero) { /* real ** real */
 135  155                          LD_IM(ans) = zero;
      156 +
 136  157                          if (hx < 0 && ix < hiinf && iu < hiinf) {
 137      -                        /* -x ** u  is exp(i*pi*u)*pow(x,u) */
      158 +                                /* -x ** u  is exp(i*pi*u)*pow(x,u) */
 138  159                                  r = powl(-x, u);
 139  160                                  sincospil(u, &s, &c);
 140      -                                LD_RE(ans) = (c == zero)? c: c * r;
 141      -                                LD_IM(ans) = (s == zero)? s: s * r;
 142      -                        } else
      161 +                                LD_RE(ans) = (c == zero) ? c : c *r;
      162 +                                LD_IM(ans) = (s == zero) ? s : s *r;
      163 +                        } else {
 143  164                                  LD_RE(ans) = powl(x, u);
      165 +                        }
 144  166                  } else if (x == zero || ix >= hiinf || iy >= hiinf) {
 145      -                        if (isnanl(x) || isnanl(y) || isnanl(u))
      167 +                        if (isnanl(x) || isnanl(y) || isnanl(u)) {
 146  168                                  LD_RE(ans) = LD_IM(ans) = x + y + u;
 147      -                        else {
      169 +                        } else {
 148  170                                  if (x == zero)
 149  171                                          r = fabsl(y);
 150  172                                  else
 151  173                                          r = fabsl(x) + fabsl(y);
      174 +
 152  175                                  t = atan2pil(y, x);
 153  176                                  sincospil(t * u, &s, &c);
 154      -                                LD_RE(ans) = (c == zero)? c: c * r;
 155      -                                LD_IM(ans) = (s == zero)? s: s * r;
      177 +                                LD_RE(ans) = (c == zero) ? c : c *r;
      178 +                                LD_IM(ans) = (s == zero) ? s : s *r;
 156  179                          }
 157      -                } else if (fabsl(x) == fabsl(y)) {    /* |x| = |y| */
      180 +                } else if (fabsl(x) == fabsl(y)) {      /* |x| = |y| */
 158  181                          if (hx >= 0) {
 159      -                                t = (hy >= 0)? 0.25L : -0.25L;
      182 +                                t = (hy >= 0) ? 0.25L : -0.25L;
 160  183                                  sincospil(t * u, &s, &c);
 161  184                          } else if ((LAST(u) & 3) == 0) {
 162      -                                t = (hy >= 0)? 0.75L : -0.75L;
      185 +                                t = (hy >= 0) ? 0.75L : -0.75L;
 163  186                                  sincospil(t * u, &s, &c);
 164  187                          } else {
 165      -                                r = (hy >= 0)? u : -u;
      188 +                                r = (hy >= 0) ? u : -u;
 166  189                                  t = -0.25L * r;
 167  190                                  w1 = r + t;
 168  191                                  w2 = t - (w1 - r);
 169  192                                  sincospil(w1, &t1, &t2);
 170  193                                  sincospil(w2, &t3, &t4);
 171  194                                  s = t1 * t4 + t3 * t2;
 172  195                                  c = t2 * t4 - t1 * t3;
 173  196                          }
      197 +
 174  198                          if (ix < 0x3ffe0000)    /* |x| < 1/2 */
 175  199                                  r = powl(fabsl(x + x), u) * exp2l(-0.5L * u);
 176  200                          else if (ix >= 0x3fff0000 || iu < 0x400cfff8)
 177  201                                  /* |x| >= 1 or |u| < 16383 */
 178  202                                  r = powl(fabsl(x), u) * exp2l(0.5L * u);
 179      -                        else   /* special treatment */
      203 +                        else            /* special treatment */
 180  204                                  j = 2;
      205 +
 181  206                          if (j == 0) {
 182      -                                LD_RE(ans) = (c == zero)? c: c * r;
 183      -                                LD_IM(ans) = (s == zero)? s: s * r;
      207 +                                LD_RE(ans) = (c == zero) ? c : c *r;
      208 +                                LD_IM(ans) = (s == zero) ? s : s *r;
 184  209                          }
 185      -                } else
      210 +                } else {
 186  211                          j = 1;
      212 +                }
      213 +
 187  214                  if (j == 0)
 188  215                          return (ans);
 189  216          }
      217 +
 190  218          if (iu >= hiinf || iv >= hiinf || ix >= hiinf || iy >= hiinf) {
 191  219                  /*
 192  220                   * non-zero imag part(s) with inf component(s) yields NaN
 193  221                   */
 194  222                  t = fabsl(x) + fabsl(y) + fabsl(u) + fabsl(v);
 195  223                  LD_RE(ans) = LD_IM(ans) = t - t;
 196  224          } else {
 197      -                k = 0;  /* no scaling */
      225 +                k = 0;                  /* no scaling */
      226 +
 198  227                  if (iu > 0x7ffe0000 || iv > 0x7ffe0000) {
 199  228                          u *= 1.52587890625000000000e-05L;
 200  229                          v *= 1.52587890625000000000e-05L;
 201      -                        k = 1;  /* scale u and v by 2**-16 */
      230 +                        k = 1;          /* scale u and v by 2**-16 */
 202  231                  }
      232 +
 203  233                  /*
 204  234                   * Use similated higher precision arithmetic to compute:
 205  235                   * r = u * log(hypot(x, y)) - v * atan2(y, x)
 206  236                   * q = u * atan2(y, x) + v * log(hypot(x, y))
 207  237                   */
 208  238  
 209  239                  t1 = __k_clog_rl(x, y, &t2);
 210  240                  t3 = __k_atan2l(y, x, &t4);
 211      -                x1 = t1; HALF(x1);
 212      -                y1 = t3; HALF(y1);
 213      -                u1 = u; HALF(u1);
 214      -                v1 = v; HALF(v1);
 215      -                x2 = t2 - (x1 - t1);    /* log(hypot(x,y)) = x1 + x2 */
 216      -                y2 = t4 - (y1 - t3);    /* atan2(y,x) = y1 + y2 */
      241 +                x1 = t1;
      242 +                HALF(x1);
      243 +                y1 = t3;
      244 +                HALF(y1);
      245 +                u1 = u;
      246 +                HALF(u1);
      247 +                v1 = v;
      248 +                HALF(v1);
      249 +                x2 = t2 - (x1 - t1);    /* log(hypot(x,y)) = x1 + x2 */
      250 +                y2 = t4 - (y1 - t3);    /* atan2(y,x) = y1 + y2 */
      251 +
 217  252                  /* compute q = u * atan2(y, x) + v * log(hypot(x, y)) */
 218  253                  if (j != 2) {
 219  254                          b[0] = u1 * y1;
 220  255                          b[1] = (u - u1) * y1 + u * y2;
      256 +
 221  257                          if (j == 1) {   /* v = 0 */
 222  258                                  w1 = b[0] + b[1];
 223  259                                  w2 = b[1] - (w1 - b[0]);
 224  260                          } else {
 225  261                                  b[2] = v1 * x1;
 226  262                                  b[3] = (v - v1) * x1 + v * x2;
 227  263                                  w1 = sum4fpl(b, &w2);
 228  264                          }
      265 +
 229  266                          sincosl(w1, &t1, &t2);
 230  267                          sincosl(w2, &t3, &t4);
 231  268                          s = t1 * t4 + t3 * t2;
 232  269                          c = t2 * t4 - t1 * t3;
 233      -                        if (k == 1)     /* square j times */
      270 +
      271 +                        if (k == 1) {   /* square j times */
 234  272                                  for (i = 0; i < 10; i++) {
 235  273                                          t1 = s * c;
 236  274                                          c = (c + s) * (c - s);
 237  275                                          s = t1 + t1;
 238  276                                  }
      277 +                        }
 239  278                  }
      279 +
 240  280                  /* compute r = u * (t1, t2) - v * (t3, t4) */
 241  281                  b[0] = u1 * x1;
 242  282                  b[1] = (u - u1) * x1 + u * x2;
 243      -                if (j == 1) {   /* v = 0 */
      283 +
      284 +                if (j == 1) {           /* v = 0 */
 244  285                          w1 = b[0] + b[1];
 245  286                          w2 = b[1] - (w1 - b[0]);
 246  287                  } else {
 247  288                          b[2] = -v1 * y1;
 248  289                          b[3] = (v1 - v) * y1 - v * y2;
 249  290                          w1 = sum4fpl(b, &w2);
 250  291                  }
      292 +
 251  293                  /* scale back unless w1 is large enough to cause exception */
 252  294                  if (k != 0 && fabsl(w1) < 20000.0L) {
 253      -                        w1 *= 65536.0L; w2 *= 65536.0L;
      295 +                        w1 *= 65536.0L;
      296 +                        w2 *= 65536.0L;
 254  297                  }
      298 +
 255  299                  hx = HI_XWORD(w1);
 256  300                  ix = hx & 0x7fffffff;
 257  301                  /* compute exp(w1 + w2) */
 258  302                  k = 0;
 259      -                if (ix < 0x3f8c0000) /* exp(tiny < 2**-115) = 1 */
      303 +
      304 +                if (ix < 0x3f8c0000) {          /* exp(tiny < 2**-115) = 1 */
 260  305                          r = one;
 261      -                else if (ix >= 0x400c6760) /* overflow/underflow */
 262      -                        r = (hx < 0)? tiny * tiny : huge * huge;
 263      -                else {  /* compute exp(w1 + w2) */
 264      -                        k = (int) (invln2 * w1 + ((hx >= 0)? 0.5L : -0.5L));
 265      -                        t1 = (long double) k;
      306 +                } else if (ix >= 0x400c6760) {  /* overflow/underflow */
      307 +                        r = (hx < 0) ? tiny * tiny : huge * huge;
      308 +                } else { /* compute exp(w1 + w2) */
      309 +                        k = (int)(invln2 * w1 + ((hx >= 0) ? 0.5L : -0.5L));
      310 +                        t1 = (long double)k;
 266  311                          t2 = w1 - t1 * ln2hil;
 267  312                          t3 = w2 - t1 * ln2lol;
 268  313                          r = expl(t2 + t3);
 269  314                  }
 270      -                if (c != zero) c *= r;
 271      -                if (s != zero) s *= r;
      315 +
      316 +                if (c != zero)
      317 +                        c *= r;
      318 +
      319 +                if (s != zero)
      320 +                        s *= r;
      321 +
 272  322                  if (k != 0) {
 273  323                          c = scalbnl(c, k);
 274  324                          s = scalbnl(s, k);
 275  325                  }
      326 +
 276  327                  LD_RE(ans) = c;
 277  328                  LD_IM(ans) = s;
 278  329          }
      330 +
 279  331          return (ans);
 280  332  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX