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

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libm/common/C/hypot.c
          +++ new/usr/src/lib/libm/common/C/hypot.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 __hypot = hypot
  31   32  
  32      -/* INDENT OFF */
       33 +
  33   34  /*
  34   35   * Hypot(x, y)
  35   36   * by K.C. Ng for SUN 4.0 libm, updated 3/11/2003.
  36   37   * Method :
  37   38   * A. When rounding is rounded-to-nearest:
  38   39   *      If z = x * x + y * y has error less than sqrt(2) / 2 ulp than
  39   40   *      sqrt(z) has error less than 1 ulp.
  40   41   *      So, compute sqrt(x*x+y*y) with some care as follows:
  41   42   *      Assume x > y > 0;
  42   43   *      1. Check whether save and set rounding to round-to-nearest
↓ open down ↓ 10 lines elided ↑ open up ↑
  53   54   *      z = sqrt(x * x + y * y)
  54   55   *              hypot(x, y) = x + (y / ((x + z) / y))
  55   56   *
  56   57   * NOTE: DO NOT remove parenthsis!
  57   58   *
  58   59   * Special cases:
  59   60   *      hypot(x, y) is INF if x or y is +INF or -INF; else
  60   61   *      hypot(x, y) is NAN if x or y is NAN.
  61   62   *
  62   63   * Accuracy:
  63      - *      hypot(x, y) returns sqrt(x^2+y^2) with error less than 1 ulps
       64 + *      hypot(x, y) returns sqrt(x^2+y^2) with error less than 1 ulps
  64   65   *      (units in the last place)
  65   66   */
  66   67  
  67   68  #include "libm.h"
  68   69  
  69      -static const double
  70      -        zero = 0.0,
       70 +static const double zero = 0.0,
  71   71          onep1u = 1.00000000000000022204e+00,    /* 0x3ff00000 1 = 1+2**-52 */
  72   72          twom53 = 1.11022302462515654042e-16,    /* 0x3ca00000 0 = 2**-53 */
  73   73          twom768 = 6.441148769597133308e-232,    /* 2^-768 */
  74      -        two768  = 1.552518092300708935e+231;    /* 2^768 */
       74 +        two768 = 1.552518092300708935e+231;     /* 2^768 */
  75   75  
  76      -/* INDENT ON */
  77   76  
  78   77  double
  79      -hypot(double x, double y) {
       78 +hypot(double x, double y)
       79 +{
  80   80          double xh, yh, w, ax, ay;
  81   81          int i, j, nx, ny, ix, iy, iscale = 0;
  82   82          unsigned lx, ly;
  83   83  
  84      -        ix = ((int *) &x)[HIWORD] & ~0x80000000;
  85      -        lx = ((int *) &x)[LOWORD];
  86      -        iy = ((int *) &y)[HIWORD] & ~0x80000000;
  87      -        ly = ((int *) &y)[LOWORD];
       84 +        ix = ((int *)&x)[HIWORD] & ~0x80000000;
       85 +        lx = ((int *)&x)[LOWORD];
       86 +        iy = ((int *)&y)[HIWORD] & ~0x80000000;
       87 +        ly = ((int *)&y)[LOWORD];
       88 +
  88   89  /*
  89   90   * Force ax = |x| ~>~ ay = |y|
  90   91   */
  91   92          if (iy > ix) {
  92   93                  ax = fabs(y);
  93   94                  ay = fabs(x);
  94   95                  i = ix;
  95   96                  ix = iy;
  96   97                  iy = i;
  97   98                  i = lx;
  98   99                  lx = ly;
  99  100                  ly = i;
 100  101          } else {
 101  102                  ax = fabs(x);
 102  103                  ay = fabs(y);
 103  104          }
      105 +
 104  106          nx = ix >> 20;
 105  107          ny = iy >> 20;
 106      -        j  = nx - ny;
      108 +        j = nx - ny;
      109 +
 107  110  /*
 108  111   * x >= 2^500 (x*x or y*y may overflow)
 109  112   */
 110  113          if (nx >= 0x5f3) {
 111  114                  if (nx == 0x7ff) {      /* inf or NaN, signal of sNaN */
 112  115                          if (((ix - 0x7ff00000) | lx) == 0)
 113  116                                  return (ax == ay ? ay : ax);
 114  117                          else if (((iy - 0x7ff00000) | ly) == 0)
 115  118                                  return (ay == ax ? ax : ay);
 116  119                          else
 117  120                                  return (ax * ay);       /* + -> * for Cheetah */
 118      -                } else if (j > 32) {    /* x >> y */
      121 +                } else if (j > 32) {                    /* x >> y */
 119  122                          if (j <= 53)
 120  123                                  ay *= twom53;
      124 +
 121  125                          ax += ay;
 122      -                        if (((int *) &ax)[HIWORD] == 0x7ff00000)
      126 +
      127 +                        if (((int *)&ax)[HIWORD] == 0x7ff00000)
 123  128                                  ax = _SVID_libm_err(x, y, 4);
      129 +
 124  130                          return (ax);
 125  131                  }
      132 +
 126  133                  ax *= twom768;
 127  134                  ay *= twom768;
 128  135                  iscale = 2;
 129  136                  ix -= 768 << 20;
 130  137                  iy -= 768 << 20;
 131  138          }
      139 +
 132  140  /*
 133  141   * y < 2^-450 (x*x or y*y may underflow)
 134  142   */
 135  143          else if (ny < 0x23d) {
 136  144                  if ((ix | lx) == 0)
 137  145                          return (ay);
      146 +
 138  147                  if ((iy | ly) == 0)
 139  148                          return (ax);
 140      -                if (j > 53)             /* x >> y */
      149 +
      150 +                if (j > 53)             /* x >> y */
 141  151                          return (ax + ay);
      152 +
 142  153                  iscale = 1;
 143  154                  ax *= two768;
 144  155                  ay *= two768;
      156 +
 145  157                  if (nx == 0) {
 146  158                          if (ax == zero) /* guard subnormal flush to zero */
 147  159                                  return (ax);
 148      -                        ix = ((int *) &ax)[HIWORD];
 149      -                } else
      160 +
      161 +                        ix = ((int *)&ax)[HIWORD];
      162 +                } else {
 150  163                          ix += 768 << 20;
      164 +                }
      165 +
 151  166                  if (ny == 0) {
 152  167                          if (ay == zero) /* guard subnormal flush to zero */
 153  168                                  return (ax * twom768);
 154      -                        iy = ((int *) &ay)[HIWORD];
 155      -                } else
      169 +
      170 +                        iy = ((int *)&ay)[HIWORD];
      171 +                } else {
 156  172                          iy += 768 << 20;
      173 +                }
      174 +
 157  175                  j = (ix >> 20) - (iy >> 20);
      176 +
 158  177                  if (j > 32) {           /* x >> y */
 159  178                          if (j <= 53)
 160  179                                  ay *= twom53;
      180 +
 161  181                          return ((ax + ay) * twom768);
 162  182                  }
 163  183          } else if (j > 32) {            /* x >> y */
 164  184                  if (j <= 53)
 165  185                          ay *= twom53;
      186 +
 166  187                  return (ax + ay);
 167  188          }
      189 +
 168  190  /*
 169  191   * Medium range ax and ay with max{|ax/ay|,|ay/ax|} bounded by 2^32
 170  192   * First check rounding mode by comparing onep1u*onep1u with onep1u+twom53.
 171  193   * Make sure the computation is done at run-time.
 172  194   */
 173  195          if (((lx | ly) << 5) == 0) {
 174  196                  ay = ay * ay;
 175  197                  ax += ay / (ax + sqrt(ax * ax + ay));
 176      -        } else
 177      -        if (onep1u * onep1u != onep1u + twom53) {
 178      -        /* round-to-zero, positive, negative mode */
 179      -        /* magic formula with less than an ulp error */
      198 +        } else if (onep1u * onep1u != onep1u + twom53) {
      199 +                /*
      200 +                 * round-to-zero, positive, negative mode
      201 +                 * magic formula with less than an ulp error
      202 +                 */
 180  203                  w = sqrt(ax * ax + ay * ay);
 181  204                  ax += ay / ((ax + w) / ay);
 182  205          } else {
 183      -        /* round-to-nearest mode */
      206 +                /* round-to-nearest mode */
 184  207                  w = ax - ay;
      208 +
 185  209                  if (w > ay) {
 186      -                        ((int *) &xh)[HIWORD] = ix;
 187      -                        ((int *) &xh)[LOWORD] = 0;
      210 +                        ((int *)&xh)[HIWORD] = ix;
      211 +                        ((int *)&xh)[LOWORD] = 0;
 188  212                          ay = ay * ay + (ax - xh) * (ax + xh);
 189  213                          ax = sqrt(xh * xh + ay);
 190  214                  } else {
 191  215                          ax = ax + ax;
 192      -                        ((int *) &xh)[HIWORD] = ix + 0x00100000;
 193      -                        ((int *) &xh)[LOWORD] = 0;
 194      -                        ((int *) &yh)[HIWORD] = iy;
 195      -                        ((int *) &yh)[LOWORD] = 0;
      216 +                        ((int *)&xh)[HIWORD] = ix + 0x00100000;
      217 +                        ((int *)&xh)[LOWORD] = 0;
      218 +                        ((int *)&yh)[HIWORD] = iy;
      219 +                        ((int *)&yh)[LOWORD] = 0;
 196  220                          ay = w * w + ((ax - xh) * yh + (ay - yh) * ax);
 197  221                          ax = sqrt(xh * yh + ay);
 198  222                  }
 199  223          }
      224 +
 200  225          if (iscale > 0) {
 201      -                if (iscale == 1)
      226 +                if (iscale == 1) {
 202  227                          ax *= twom768;
 203      -                else {
      228 +                } else {
 204  229                          ax *= two768;   /* must generate side effect here */
 205      -                        if (((int *) &ax)[HIWORD] == 0x7ff00000)
      230 +
      231 +                        if (((int *)&ax)[HIWORD] == 0x7ff00000)
 206  232                                  ax = _SVID_libm_err(x, y, 4);
 207  233                  }
 208  234          }
      235 +
 209  236          return (ax);
 210  237  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX