Print this page
11175 libm should use signbit() correctly
11188 c99 math macros should return strictly backward compatible values

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libm/common/Q/__rem_pio2l.c
          +++ new/usr/src/lib/libm/common/Q/__rem_pio2l.c
↓ open down ↓ 42 lines elided ↑ open up ↑
  43   43  
  44   44  #include "longdouble.h"
  45   45  
  46   46  extern const int _TBL_ipio2l_inf[];
  47   47  
  48   48  static const long double
  49   49          two24l = 16777216.0L,
  50   50          pio4   = 0.7853981633974483096156608458198757210495L;
  51   51  
  52   52  int
  53      -__rem_pio2l(long double x, long double *y) {
       53 +__rem_pio2l(long double x, long double *y)
       54 +{
  54   55          long double z, w;
  55   56          double t[5], v[5];
  56   57          int e0, i, nx, n, sign;
  57   58          const int *ipio2;
  58   59  
  59   60          sign = signbitl(x);
  60   61          z = fabsl(x);
  61   62          if (z <= pio4) {
  62   63                  y[0] = x;
  63   64                  y[1] = 0;
  64   65                  return (0);
  65   66          }
  66   67          e0 = ilogbl(z) - 23;
  67   68          z = scalbnl(z, -e0);
  68   69          for (i = 0; i < 5; i++) {
  69      -                t[i] = (double) ((int) (z));
  70      -                z = (z - (long double) t[i]) * two24l;
       70 +                t[i] = (double)((int)(z));
       71 +                z = (z - (long double)t[i]) * two24l;
  71   72          }
  72   73          nx = 5;
  73   74          while (t[nx - 1] == 0.0)
  74   75                  nx--;           /* skip zero term */
  75   76          ipio2 = _TBL_ipio2l_inf;
  76      -        n = __rem_pio2m(t, v, e0, nx, 3, (const int *) ipio2);
  77      -        z = (long double) v[2] + (long double) v[1];
  78      -        w = (long double) v[0];
       77 +        n = __rem_pio2m(t, v, e0, nx, 3, (const int *)ipio2);
       78 +        z = (long double)v[2] + (long double)v[1];
       79 +        w = (long double)v[0];
  79   80          y[0] = z + w;
  80   81          y[1] = z - (y[0] - w);
  81      -        if (sign == 1) {
       82 +        if (sign != 0) {
  82   83                  y[0] = -y[0];
  83   84                  y[1] = -y[1];
  84   85                  return (-n);
  85   86          }
  86   87          return (n);
  87   88  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX