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

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libm/common/complex/cabs.c
          +++ new/usr/src/lib/libm/common/complex/cabs.c
↓ open down ↓ 10 lines elided ↑ open up ↑
  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   *
  19   19   * CDDL HEADER END
  20   20   */
       21 +
  21   22  /*
  22   23   * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  23   24   */
       25 +
  24   26  /*
  25   27   * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  26   28   * Use is subject to license terms.
  27   29   */
  28   30  
  29   31  #pragma weak __cabs = cabs
  30   32  
  31   33  #include <math.h>
  32   34  #include "complex_wrapper.h"
  33   35  
  34   36  /*
  35   37   * If C were the only standard we cared about, cabs could just call
  36   38   * hypot.  Unfortunately, various other standards say that hypot must
  37   39   * call matherr and/or set errno to ERANGE when the result overflows.
  38   40   * Since cabs should do neither of these things, we have to either
  39   41   * make hypot a wrapper on another internal function or duplicate
  40   42   * the hypot implementation here.  I've chosen to do the latter.
  41   43   */
  42   44  
  43      -static const double
  44      -        zero = 0.0,
       45 +static const double zero = 0.0,
  45   46          onep1u = 1.00000000000000022204e+00,    /* 0x3ff00000 1 = 1+2**-52 */
  46   47          twom53 = 1.11022302462515654042e-16,    /* 0x3ca00000 0 = 2**-53 */
  47   48          twom768 = 6.441148769597133308e-232,    /* 2^-768 */
  48      -        two768  = 1.552518092300708935e+231;    /* 2^768 */
       49 +        two768 = 1.552518092300708935e+231;     /* 2^768 */
  49   50  
  50   51  double
  51   52  cabs(dcomplex z)
  52   53  {
  53      -        double          x, y, xh, yh, w, ax, ay;
  54      -        int             i, j, nx, ny, ix, iy, iscale = 0;
  55      -        unsigned        lx, ly;
       54 +        double x, y, xh, yh, w, ax, ay;
       55 +        int i, j, nx, ny, ix, iy, iscale = 0;
       56 +        unsigned lx, ly;
  56   57  
  57   58          x = D_RE(z);
  58   59          y = D_IM(z);
  59   60  
  60   61          ix = ((int *)&x)[HIWORD] & ~0x80000000;
  61   62          lx = ((int *)&x)[LOWORD];
  62   63          iy = ((int *)&y)[HIWORD] & ~0x80000000;
  63   64          ly = ((int *)&y)[LOWORD];
  64   65  
  65   66          /* force ax = |x| ~>~ ay = |y| */
↓ open down ↓ 3 lines elided ↑ open up ↑
  69   70                  i = ix;
  70   71                  ix = iy;
  71   72                  iy = i;
  72   73                  i = lx;
  73   74                  lx = ly;
  74   75                  ly = i;
  75   76          } else {
  76   77                  ax = fabs(x);
  77   78                  ay = fabs(y);
  78   79          }
       80 +
  79   81          nx = ix >> 20;
  80   82          ny = iy >> 20;
  81      -        j  = nx - ny;
       83 +        j = nx - ny;
  82   84  
  83   85          if (nx >= 0x5f3) {
  84   86                  /* x >= 2^500 (x*x or y*y may overflow) */
  85   87                  if (nx == 0x7ff) {
  86   88                          /* inf or NaN, signal of sNaN */
  87   89                          if (((ix - 0x7ff00000) | lx) == 0)
  88      -                                return ((ax == ay)? ay : ax);
       90 +                                return ((ax == ay) ? ay : ax);
  89   91                          else if (((iy - 0x7ff00000) | ly) == 0)
  90      -                                return ((ay == ax)? ax : ay);
       92 +                                return ((ay == ax) ? ax : ay);
  91   93                          else
  92   94                                  return (ax * ay);
  93   95                  } else if (j > 32) {
  94   96                          /* x >> y */
  95   97                          if (j <= 53)
  96   98                                  ay *= twom53;
       99 +
  97  100                          ax += ay;
  98  101                          return (ax);
  99  102                  }
      103 +
 100  104                  ax *= twom768;
 101  105                  ay *= twom768;
 102  106                  iscale = 2;
 103  107                  ix -= 768 << 20;
 104  108                  iy -= 768 << 20;
 105  109          } else if (ny < 0x23d) {
 106  110                  /* y < 2^-450 (x*x or y*y may underflow) */
 107  111                  if ((ix | lx) == 0)
 108  112                          return (ay);
      113 +
 109  114                  if ((iy | ly) == 0)
 110  115                          return (ax);
 111      -                if (j > 53)             /* x >> y */
      116 +
      117 +                if (j > 53)             /* x >> y */
 112  118                          return (ax + ay);
      119 +
 113  120                  iscale = 1;
 114  121                  ax *= two768;
 115  122                  ay *= two768;
      123 +
 116  124                  if (nx == 0) {
 117  125                          if (ax == zero) /* guard subnormal flush to zero */
 118  126                                  return (ax);
      127 +
 119  128                          ix = ((int *)&ax)[HIWORD];
 120  129                  } else {
 121  130                          ix += 768 << 20;
 122  131                  }
      132 +
 123  133                  if (ny == 0) {
 124  134                          if (ay == zero) /* guard subnormal flush to zero */
 125  135                                  return (ax * twom768);
      136 +
 126  137                          iy = ((int *)&ay)[HIWORD];
 127  138                  } else {
 128  139                          iy += 768 << 20;
 129  140                  }
      141 +
 130  142                  j = (ix >> 20) - (iy >> 20);
      143 +
 131  144                  if (j > 32) {
 132  145                          /* x >> y */
 133  146                          if (j <= 53)
 134  147                                  ay *= twom53;
      148 +
 135  149                          return ((ax + ay) * twom768);
 136  150                  }
 137  151          } else if (j > 32) {
 138  152                  /* x >> y */
 139  153                  if (j <= 53)
 140  154                          ay *= twom53;
      155 +
 141  156                  return (ax + ay);
 142  157          }
 143  158  
 144  159          /*
 145  160           * Medium range ax and ay with max{|ax/ay|,|ay/ax|} bounded by 2^32.
 146  161           * First check rounding mode by comparing onep1u*onep1u with onep1u
 147  162           * + twom53.  Make sure the computation is done at run-time.
 148  163           */
 149  164          if (((lx | ly) << 5) == 0) {
 150  165                  ay = ay * ay;
 151  166                  ax += ay / (ax + sqrt(ax * ax + ay));
 152  167          } else if (onep1u * onep1u != onep1u + twom53) {
 153      -                /* round-to-zero, positive, negative mode */
 154      -                /* magic formula with less than an ulp error */
      168 +                /*
      169 +                 * round-to-zero, positive, negative mode
      170 +                 * magic formula with less than an ulp error
      171 +                 */
 155  172                  w = sqrt(ax * ax + ay * ay);
 156  173                  ax += ay / ((ax + w) / ay);
 157  174          } else {
 158  175                  /* round-to-nearest mode */
 159  176                  w = ax - ay;
      177 +
 160  178                  if (w > ay) {
 161  179                          ((int *)&xh)[HIWORD] = ix;
 162  180                          ((int *)&xh)[LOWORD] = 0;
 163  181                          ay = ay * ay + (ax - xh) * (ax + xh);
 164  182                          ax = sqrt(xh * xh + ay);
 165  183                  } else {
 166  184                          ax = ax + ax;
 167  185                          ((int *)&xh)[HIWORD] = ix + 0x00100000;
 168  186                          ((int *)&xh)[LOWORD] = 0;
 169  187                          ((int *)&yh)[HIWORD] = iy;
 170  188                          ((int *)&yh)[LOWORD] = 0;
 171  189                          ay = w * w + ((ax - xh) * yh + (ay - yh) * ax);
 172  190                          ax = sqrt(xh * yh + ay);
 173  191                  }
 174  192          }
      193 +
 175  194          if (iscale > 0) {
 176  195                  if (iscale == 1)
 177  196                          ax *= twom768;
 178  197                  else
 179  198                          ax *= two768;   /* must generate side effect here */
 180  199          }
      200 +
 181  201          return (ax);
 182  202  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX