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

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libm/common/C/sincos.c
          +++ new/usr/src/lib/libm/common/C/sincos.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 __sincos = sincos
  30   32  
  31      -/* INDENT OFF */
  32   33  /*
  33   34   * sincos(x,s,c)
  34   35   * Accurate Table look-up algorithm by K.C. Ng, 2000.
  35   36   *
  36   37   * 1. Reduce x to x>0 by cos(-x)=cos(x), sin(-x)=-sin(x).
  37   38   * 2. For 0<= x < 8, let i = (64*x chopped)-10. Let d = x - a[i], where
  38   39   *    a[i] is a double that is close to (i+10.5)/64 (and hence |d|< 10.5/64)
  39   40   *    and such that sin(a[i]) and cos(a[i]) is close to a double (with error
  40   41   *    less than 2**-8 ulp). Then
  41   42   *
↓ open down ↓ 42 lines elided ↑ open up ↑
  84   85   *      Let trig be any of sin, cos, or tan.
  85   86   *      trig(+-INF)  is NaN, with signals;
  86   87   *      trig(NaN)    is that NaN;
  87   88   *
  88   89   * Accuracy:
  89   90   *      TRIG(x) returns trig(x) nearly rounded (less than 1 ulp)
  90   91   */
  91   92  
  92   93  #include "libm.h"
  93   94  
       95 +/* BEGIN CSTYLED */
  94   96  static const double sc[] = {
  95      -/* ONE  = */  1.0,
       97 +/* ONE  = */
       98 +        1.0,
  96   99  /* NONE = */ -1.0,
      100 +
  97  101  /*
  98  102   * |sin(x) - (x+pp1*x^3+pp2*x^5)| <= 2^-58.79 for |x| < 0.008
  99  103   */
 100      -/* PP1  = */ -0.166666666666316558867252052378889521480627858683055567,
 101      -/* PP2  = */   .008333315652997472323564894248466758248475374977974017927,
      104 +/* PP1  = */-0.166666666666316558867252052378889521480627858683055567,
      105 +/* PP2  = */.008333315652997472323564894248466758248475374977974017927,
      106 +
 102  107  /*
 103  108   * |(sin(x) - (x+p1*x^3+...+p4*x^9)|
 104  109   * |------------------------------ | <= 2^-57.63 for |x| < 0.1953125
 105  110   * |                 x             |
 106  111   */
 107      -/* P1   = */ -1.666666666666629669805215138920301589656e-0001,
 108      -/* P2   = */  8.333333332390951295683993455280336376663e-0003,
 109      -/* P3   = */ -1.984126237997976692791551778230098403960e-0004,
 110      -/* P4   = */  2.753403624854277237649987622848330351110e-0006,
      112 +/* P1   = */ -1.666666666666629669805215138920301589656e-0001,
      113 +/* P2   = */ 8.333333332390951295683993455280336376663e-0003,
      114 +/* P3   = */ -1.984126237997976692791551778230098403960e-0004,
      115 +/* P4   = */ 2.753403624854277237649987622848330351110e-0006,
      116 +
 111  117  /*
 112  118   * |cos(x) - (1+qq1*x^2+qq2*x^4)| <= 2^-55.99 for |x| <= 0.008 (0x3f80624d)
 113  119   */
 114      -/* QQ1  = */ -0.4999999999975492381842911981948418542742729,
 115      -/* QQ2  = */  0.041666542904352059294545209158357640398771740,
 116      -/* Q1   = */ -0.5,
 117      -/* Q2   = */  4.166666666500350703680945520860748617445e-0002,
 118      -/* Q3   = */ -1.388888596436972210694266290577848696006e-0003,
 119      -/* Q4   = */  2.478563078858589473679519517892953492192e-0005,
 120      -/* PIO2_H    = */  1.570796326794896557999,
 121      -/* PIO2_L    = */  6.123233995736765886130e-17,
 122      -/* PIO2_L0   = */  6.123233995727922165564e-17,
 123      -/* PIO2_L1   = */  8.843720566135701120255e-29,
 124      -/* PI_H      = */  3.1415926535897931159979634685,
 125      -/* PI_L      = */  1.22464679914735317722606593227425e-16,
 126      -/* PI_L0     = */  1.22464679914558443311283879205095e-16,
 127      -/* PI_L1     = */  1.768744113227140223300005233735517376e-28,
 128      -/* PI3O2_H   = */  4.712388980384689673997,
 129      -/* PI3O2_L   = */  1.836970198721029765839e-16,
 130      -/* PI3O2_L0  = */  1.836970198720396133587e-16,
 131      -/* PI3O2_L1  = */  6.336322524749201142226e-29,
 132      -/* PI2_H     = */  6.2831853071795862319959269370,
 133      -/* PI2_L     = */  2.44929359829470635445213186454850e-16,
 134      -/* PI2_L0    = */  2.44929359829116886622567758410190e-16,
 135      -/* PI2_L1    = */  3.537488226454280446600010467471034752e-28,
 136      -/* PI5O2_H   = */  7.853981633974482789995,
 137      -/* PI5O2_L   = */  3.061616997868382943065e-16,
 138      -/* PI5O2_L0  = */  3.061616997861941598865e-16,
 139      -/* PI5O2_L1  = */  6.441344200433640781982e-28,
      120 +/* QQ1  = */-0.4999999999975492381842911981948418542742729,
      121 +/* QQ2  = */0.041666542904352059294545209158357640398771740,
      122 +/* Q1   = */ -0.5,
      123 +/* Q2   = */ 4.166666666500350703680945520860748617445e-0002,
      124 +/* Q3   = */ -1.388888596436972210694266290577848696006e-0003,
      125 +/* Q4   = */ 2.478563078858589473679519517892953492192e-0005,
      126 +/* PIO2_H    = */ 1.570796326794896557999,
      127 +/* PIO2_L    = */ 6.123233995736765886130e-17,
      128 +/* PIO2_L0   = */ 6.123233995727922165564e-17,
      129 +/* PIO2_L1   = */ 8.843720566135701120255e-29,
      130 +/* PI_H      = */ 3.1415926535897931159979634685,
      131 +/* PI_L      = */ 1.22464679914735317722606593227425e-16,
      132 +/* PI_L0     = */ 1.22464679914558443311283879205095e-16,
      133 +/* PI_L1     = */ 1.768744113227140223300005233735517376e-28,
      134 +/* PI3O2_H   = */ 4.712388980384689673997,
      135 +/* PI3O2_L   = */ 1.836970198721029765839e-16,
      136 +/* PI3O2_L0  = */ 1.836970198720396133587e-16,
      137 +/* PI3O2_L1  = */ 6.336322524749201142226e-29,
      138 +/* PI2_H     = */ 6.2831853071795862319959269370,
      139 +/* PI2_L     = */ 2.44929359829470635445213186454850e-16,
      140 +/* PI2_L0    = */ 2.44929359829116886622567758410190e-16,
      141 +/* PI2_L1    = */ 3.537488226454280446600010467471034752e-28,
      142 +/* PI5O2_H   = */ 7.853981633974482789995,
      143 +/* PI5O2_L   = */ 3.061616997868382943065e-16,
      144 +/* PI5O2_L0  = */ 3.061616997861941598865e-16,
      145 +/* PI5O2_L1  = */ 6.441344200433640781982e-28,
 140  146  };
 141      -/* INDENT ON */
      147 +/* END CSTYLED */
 142  148  
 143      -#define ONE             sc[0]
 144      -#define PP1             sc[2]
 145      -#define PP2             sc[3]
 146      -#define P1              sc[4]
 147      -#define P2              sc[5]
 148      -#define P3              sc[6]
 149      -#define P4              sc[7]
 150      -#define QQ1             sc[8]
 151      -#define QQ2             sc[9]
 152      -#define Q1              sc[10]
 153      -#define Q2              sc[11]
 154      -#define Q3              sc[12]
 155      -#define Q4              sc[13]
 156      -#define PIO2_H          sc[14]
 157      -#define PIO2_L          sc[15]
 158      -#define PIO2_L0         sc[16]
 159      -#define PIO2_L1         sc[17]
 160      -#define PI_H            sc[18]
 161      -#define PI_L            sc[19]
 162      -#define PI_L0           sc[20]
 163      -#define PI_L1           sc[21]
 164      -#define PI3O2_H         sc[22]
 165      -#define PI3O2_L         sc[23]
 166      -#define PI3O2_L0        sc[24]
 167      -#define PI3O2_L1        sc[25]
 168      -#define PI2_H           sc[26]
 169      -#define PI2_L           sc[27]
 170      -#define PI2_L0          sc[28]
 171      -#define PI2_L1          sc[29]
 172      -#define PI5O2_H         sc[30]
 173      -#define PI5O2_L         sc[31]
 174      -#define PI5O2_L0        sc[32]
 175      -#define PI5O2_L1        sc[33]
 176      -#define PoS(x, z)       ((x * z) * (PP1 + z * PP2))
 177      -#define PoL(x, z)       ((x * z) * ((P1 + z * P2) + (z * z) * (P3 + z * P4)))
      149 +#define ONE                     sc[0]
      150 +#define PP1                     sc[2]
      151 +#define PP2                     sc[3]
      152 +#define P1                      sc[4]
      153 +#define P2                      sc[5]
      154 +#define P3                      sc[6]
      155 +#define P4                      sc[7]
      156 +#define QQ1                     sc[8]
      157 +#define QQ2                     sc[9]
      158 +#define Q1                      sc[10]
      159 +#define Q2                      sc[11]
      160 +#define Q3                      sc[12]
      161 +#define Q4                      sc[13]
      162 +#define PIO2_H                  sc[14]
      163 +#define PIO2_L                  sc[15]
      164 +#define PIO2_L0                 sc[16]
      165 +#define PIO2_L1                 sc[17]
      166 +#define PI_H                    sc[18]
      167 +#define PI_L                    sc[19]
      168 +#define PI_L0                   sc[20]
      169 +#define PI_L1                   sc[21]
      170 +#define PI3O2_H                 sc[22]
      171 +#define PI3O2_L                 sc[23]
      172 +#define PI3O2_L0                sc[24]
      173 +#define PI3O2_L1                sc[25]
      174 +#define PI2_H                   sc[26]
      175 +#define PI2_L                   sc[27]
      176 +#define PI2_L0                  sc[28]
      177 +#define PI2_L1                  sc[29]
      178 +#define PI5O2_H                 sc[30]
      179 +#define PI5O2_L                 sc[31]
      180 +#define PI5O2_L0                sc[32]
      181 +#define PI5O2_L1                sc[33]
      182 +#define PoS(x, z)               ((x * z) * (PP1 + z * PP2))
      183 +#define PoL(x, z)               ((x * z) * ((P1 + z * P2) + (z * z) * \
      184 +        (P3 + z * P4)))
 178  185  
 179  186  extern const double _TBL_sincos[], _TBL_sincosx[];
 180  187  
 181  188  void
 182      -sincos(double x, double *s, double *c) {
 183      -        double  z, y[2], w, t, v, p, q;
 184      -        int     i, j, n, hx, ix, lx;
      189 +sincos(double x, double *s, double *c)
      190 +{
      191 +        double z, y[2], w, t, v, p, q;
      192 +        int i, j, n, hx, ix, lx;
 185  193  
 186  194          hx = ((int *)&x)[HIWORD];
 187  195          lx = ((int *)&x)[LOWORD];
 188  196          ix = hx & ~0x80000000;
 189  197  
 190      -        if (ix <= 0x3fc50000) { /* |x| < 10.5/64 = 0.164062500 */
      198 +        if (ix <= 0x3fc50000) {         /* |x| < 10.5/64 = 0.164062500 */
 191  199                  if (ix < 0x3e400000) {  /* |x| < 2**-27 */
 192  200                          if ((int)x == 0)
 193  201                                  *c = ONE;
      202 +
 194  203                          *s = x;
 195  204                  } else {
 196  205                          z = x * x;
      206 +
 197  207                          if (ix < 0x3f800000) {  /* |x| < 0.008 */
 198  208                                  q = z * (QQ1 + z * QQ2);
 199  209                                  p = PoS(x, z);
 200  210                          } else {
 201      -                                q = z * ((Q1 + z * Q2) + (z * z) *
 202      -                                    (Q3 + z * Q4));
      211 +                                q = z * ((Q1 + z * Q2) + (z * z) * (Q3 + z *
      212 +                                    Q4));
 203  213                                  p = PoL(x, z);
 204  214                          }
      215 +
 205  216                          *c = ONE + q;
 206  217                          *s = x + p;
 207  218                  }
      219 +
 208  220                  return;
 209  221          }
 210  222  
 211  223          n = ix >> 20;
 212  224          i = (((ix >> 12) & 0xff) | 0x100) >> (0x401 - n);
 213  225          j = i - 10;
 214      -        if (n < 0x402) {        /* |x| < 8 */
      226 +
      227 +        if (n < 0x402) {                /* |x| < 8 */
 215  228                  x = fabs(x);
 216  229                  v = x - _TBL_sincosx[j];
 217  230                  t = v * v;
 218      -                w = _TBL_sincos[(j<<1)];
 219      -                z = _TBL_sincos[(j<<1)+1];
      231 +                w = _TBL_sincos[(j << 1)];
      232 +                z = _TBL_sincos[(j << 1) + 1];
 220  233                  p = v + PoS(v, t);
 221  234                  q = t * (QQ1 + t * QQ2);
 222      -                if ((((j - 81) ^ (j - 101)) |
 223      -                    ((j - 282) ^ (j - 302)) |
 224      -                    ((j - 483) ^ (j - 503)) |
 225      -                    ((j - 181) ^ (j - 201)) |
 226      -                    ((j - 382) ^ (j - 402))) < 0) {
      235 +
      236 +                if ((((j - 81) ^ (j - 101)) | ((j - 282) ^ (j - 302)) | ((j -
      237 +                    483) ^ (j - 503)) | ((j - 181) ^ (j - 201)) | ((j - 382) ^
      238 +                    (j - 402))) < 0) {
 227  239                          if (j <= 101) {
 228  240                                  /* near pi/2, cos(x) = sin(pi/2-x) */
 229  241                                  t = w * q + z * p;
 230      -                                *s = (hx >= 0)? w + t : -w - t;
      242 +                                *s = (hx >= 0) ? w + t : -w - t;
 231  243                                  p = PIO2_H - x;
 232  244                                  i = ix - 0x3ff921fb;
 233  245                                  x = p + PIO2_L;
 234      -                                if ((i | ((lx - 0x54442D00) &
 235      -                                    0xffffff00)) == 0) {
      246 +
      247 +                                if ((i | ((lx - 0x54442D00) & 0xffffff00)) ==
      248 +                                    0) {
 236  249                                          /* very close to pi/2 */
 237  250                                          x = p + PIO2_L0;
 238  251                                          *c = x + PIO2_L1;
 239  252                                  } else {
 240  253                                          z = x * x;
      254 +
 241  255                                          if (((ix - 0x3ff92000) >> 12) == 0) {
 242  256                                                  /* |pi/2-x|<2**-8 */
 243  257                                                  w = PIO2_L + PoS(x, z);
 244  258                                          } else {
 245  259                                                  w = PIO2_L + PoL(x, z);
 246  260                                          }
      261 +
 247  262                                          *c = p + w;
 248  263                                  }
 249  264                          } else if (j <= 201) {
 250  265                                  /* near pi, sin(x) = sin(pi-x) */
 251  266                                  *c = z - (w * p - z * q);
 252  267                                  p = PI_H - x;
 253  268                                  i = ix - 0x400921fb;
 254  269                                  x = p + PI_L;
 255      -                                if ((i | ((lx - 0x54442D00) &
 256      -                                    0xffffff00)) == 0) {
      270 +
      271 +                                if ((i | ((lx - 0x54442D00) & 0xffffff00)) ==
      272 +                                    0) {
 257  273                                          /* very close to pi */
 258  274                                          x = p + PI_L0;
 259      -                                        *s = (hx >= 0)? x + PI_L1 :
 260      -                                            -(x + PI_L1);
      275 +                                        *s = (hx >= 0) ? x + PI_L1 : -(x +
      276 +                                            PI_L1);
 261  277                                  } else {
 262  278                                          z = x * x;
      279 +
 263  280                                          if (((ix - 0x40092000) >> 11) == 0) {
 264  281                                                  /* |pi-x|<2**-8 */
 265  282                                                  w = PI_L + PoS(x, z);
 266  283                                          } else {
 267  284                                                  w = PI_L + PoL(x, z);
 268  285                                          }
 269      -                                        *s = (hx >= 0)? p + w : -p - w;
      286 +
      287 +                                        *s = (hx >= 0) ? p + w : -p - w;
 270  288                                  }
 271  289                          } else if (j <= 302) {
 272  290                                  /* near 3/2pi, cos(x)=sin(x-3/2pi) */
 273  291                                  t = w * q + z * p;
 274      -                                *s = (hx >= 0)? w + t : -w - t;
      292 +                                *s = (hx >= 0) ? w + t : -w - t;
 275  293                                  p = x - PI3O2_H;
 276  294                                  i = ix - 0x4012D97C;
 277  295                                  x = p - PI3O2_L;
 278      -                                if ((i | ((lx - 0x7f332100) &
 279      -                                    0xffffff00)) == 0) {
      296 +
      297 +                                if ((i | ((lx - 0x7f332100) & 0xffffff00)) ==
      298 +                                    0) {
 280  299                                          /* very close to 3/2pi */
 281  300                                          x = p - PI3O2_L0;
 282  301                                          *c = x - PI3O2_L1;
 283  302                                  } else {
 284  303                                          z = x * x;
      304 +
 285  305                                          if (((ix - 0x4012D800) >> 9) == 0) {
 286  306                                                  /* |3/2pi-x|<2**-8 */
 287  307                                                  w = PoS(x, z) - PI3O2_L;
 288  308                                          } else {
 289  309                                                  w = PoL(x, z) - PI3O2_L;
 290  310                                          }
      311 +
 291  312                                          *c = p + w;
 292  313                                  }
 293  314                          } else if (j <= 402) {
 294  315                                  /* near 2pi, sin(x)=sin(x-2pi) */
 295  316                                  *c = z - (w * p - z * q);
 296  317                                  p = x - PI2_H;
 297  318                                  i = ix - 0x401921fb;
 298  319                                  x = p - PI2_L;
 299      -                                if ((i | ((lx - 0x54442D00) &
 300      -                                    0xffffff00)) == 0) {
      320 +
      321 +                                if ((i | ((lx - 0x54442D00) & 0xffffff00)) ==
      322 +                                    0) {
 301  323                                          /* very close to 2pi */
 302  324                                          x = p - PI2_L0;
 303      -                                        *s = (hx >= 0)? x - PI2_L1 :
 304      -                                            -(x - PI2_L1);
      325 +                                        *s = (hx >= 0) ? x - PI2_L1 : -(x -
      326 +                                            PI2_L1);
 305  327                                  } else {
 306  328                                          z = x * x;
      329 +
 307  330                                          if (((ix - 0x40192000) >> 10) == 0) {
 308  331                                                  /* |x-2pi|<2**-8 */
 309  332                                                  w = PoS(x, z) - PI2_L;
 310  333                                          } else {
 311  334                                                  w = PoL(x, z) - PI2_L;
 312  335                                          }
 313      -                                        *s = (hx >= 0)? p + w : -p - w;
      336 +
      337 +                                        *s = (hx >= 0) ? p + w : -p - w;
 314  338                                  }
 315  339                          } else {
 316  340                                  /* near 5pi/2, cos(x) = sin(5pi/2-x) */
 317  341                                  t = w * q + z * p;
 318      -                                *s = (hx >= 0)? w + t : -w - t;
      342 +                                *s = (hx >= 0) ? w + t : -w - t;
 319  343                                  p = PI5O2_H - x;
 320  344                                  i = ix - 0x401F6A7A;
 321  345                                  x = p + PI5O2_L;
 322      -                                if ((i | ((lx - 0x29553800) &
 323      -                                    0xffffff00)) == 0) {
      346 +
      347 +                                if ((i | ((lx - 0x29553800) & 0xffffff00)) ==
      348 +                                    0) {
 324  349                                          /* very close to pi/2 */
 325  350                                          x = p + PI5O2_L0;
 326  351                                          *c = x + PI5O2_L1;
 327  352                                  } else {
 328  353                                          z = x * x;
      354 +
 329  355                                          if (((ix - 0x401F6A7A) >> 7) == 0) {
 330  356                                                  /* |5pi/2-x|<2**-8 */
 331  357                                                  w = PI5O2_L + PoS(x, z);
 332  358                                          } else {
 333  359                                                  w = PI5O2_L + PoL(x, z);
 334  360                                          }
      361 +
 335  362                                          *c = p + w;
 336  363                                  }
 337  364                          }
 338  365                  } else {
 339  366                          *c = z - (w * p - z * q);
 340  367                          t = w * q + z * p;
 341      -                        *s = (hx >= 0)? w + t : -w - t;
      368 +                        *s = (hx >= 0) ? w + t : -w - t;
 342  369                  }
      370 +
 343  371                  return;
 344  372          }
 345  373  
 346  374          if (ix >= 0x7ff00000) {
 347  375                  *s = *c = x / x;
 348  376                  return;
 349  377          }
 350  378  
 351  379          /* argument reduction needed */
 352  380          n = __rem_pio2(x, y);
      381 +
 353  382          switch (n & 3) {
 354  383          case 0:
 355  384                  *s = __k_sincos(y[0], y[1], c);
 356  385                  break;
 357  386          case 1:
 358  387                  *c = -__k_sincos(y[0], y[1], s);
 359  388                  break;
 360  389          case 2:
 361  390                  *s = -__k_sincos(y[0], y[1], c);
 362  391                  *c = -*c;
 363  392                  break;
 364  393          default:
 365  394                  *c = __k_sincos(y[0], y[1], s);
 366  395                  *s = -*s;
 367  396          }
 368  397  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX