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/atan2l.c
          +++ new/usr/src/lib/libm/common/Q/atan2l.c
↓ open down ↓ 55 lines elided ↑ open up ↑
  56   56   * shown.
  57   57   */
  58   58  
  59   59  #pragma weak __atan2l = atan2l
  60   60  
  61   61  #include "libm.h"
  62   62  #include "longdouble.h"
  63   63  
  64   64  static const long double
  65   65          zero    =  0.0L,
  66      -        tiny    =  1.0e-40L,
       66 +        tiny    =  1.0e-40L,
  67   67          one     =  1.0L,
  68   68          half    =  0.5L,
  69   69          PI3o4   =  2.356194490192344928846982537459627163148L,
  70   70          PIo4    =  0.785398163397448309615660845819875721049L,
  71   71          PIo2    =  1.570796326794896619231321691639751442099L,
  72   72          PI      =  3.141592653589793238462643383279502884197L,
  73   73          PI_lo   =  8.671810130123781024797044026043351968762e-35L;
  74   74  
  75   75  long double
  76      -atan2l(long double y, long double x) {
       76 +atan2l(long double y, long double x)
       77 +{
  77   78          long double t, z;
  78   79          int k, m, signy, signx;
  79   80  
  80   81          if (x != x || y != y)
  81   82                  return (x + y); /* return NaN if x or y is NAN */
  82   83          signy = signbitl(y);
  83   84          signx = signbitl(x);
  84   85          if (x == one)
  85   86                  return (atanl(y));
  86      -        m = signy + signx + signx;
       87 +        /* Ensure sign indicators are boolean */
       88 +        m = (signy != 0) + (signx != 0) + (signx != 0);
  87   89  
  88   90          /* when y = 0 */
  89   91          if (y == zero)
  90   92                  switch (m) {
  91   93                  case 0:
  92   94                          return (y);     /* atan(+0,+anything) */
  93   95                  case 1:
  94   96                          return (y);     /* atan(-0,+anything) */
  95   97                  case 2:
  96   98                          return (PI + tiny);     /* atan(+0,-anything) */
  97   99                  case 3:
  98  100                          return (-PI - tiny);    /* atan(-0,-anything) */
  99  101                  }
 100  102  
 101  103          /* when x = 0 */
 102  104          if (x == zero)
 103      -                return (signy == 1 ? -PIo2 - tiny : PIo2 + tiny);
      105 +                return (signy != 0 ? -PIo2 - tiny : PIo2 + tiny);
 104  106  
 105  107          /* when x is INF */
 106  108          if (!finitel(x)) {
 107  109                  if (!finitel(y)) {
 108  110                          switch (m) {
 109  111                          case 0:
 110  112                                  return (PIo4 + tiny);   /* atan(+INF,+INF) */
 111  113                          case 1:
 112  114                                  return (-PIo4 - tiny);  /* atan(-INF,+INF) */
 113  115                          case 2:
↓ open down ↓ 9 lines elided ↑ open up ↑
 123  125                                  return (-zero); /* atan(-...,+INF) */
 124  126                          case 2:
 125  127                                  return (PI + tiny);     /* atan(+...,-INF) */
 126  128                          case 3:
 127  129                                  return (-PI - tiny);    /* atan(-...,-INF) */
 128  130                          }
 129  131                  }
 130  132          }
 131  133          /* when y is INF */
 132  134          if (!finitel(y))
 133      -                return (signy == 1 ? -PIo2 - tiny : PIo2 + tiny);
      135 +                return (signy != 0 ? -PIo2 - tiny : PIo2 + tiny);
 134  136  
 135  137          /* compute y/x */
 136  138          x = fabsl(x);
 137  139          y = fabsl(y);
 138  140          t = PI_lo;
 139  141          k = (ilogbl(y) - ilogbl(x));
 140  142  
 141  143          if (k > 120)
 142  144                  z = PIo2 + half * t;
 143  145          else if (m > 1 && k < -120)
↓ open down ↓ 5 lines elided ↑ open up ↑
 149  151          case 0:
 150  152                  return (z);     /* atan(+,+) */
 151  153          case 1:
 152  154                  return (-z);    /* atan(-,+) */
 153  155          case 2:
 154  156                  return (PI - (z - t));  /* atan(+,-) */
 155  157          case 3:
 156  158                  return ((z - t) - PI);  /* atan(-,-) */
 157  159          }
 158  160          /* NOTREACHED */
 159      -    return 0.0L;
      161 +        return (0.0L);
 160  162  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX