math: use double_t for temporaries to avoid stores on i386
[musl] / src / math / atanf.c
index 73cebb5..ac8bfd0 100644 (file)
@@ -38,30 +38,26 @@ static const float aT[] = {
   6.1687607318e-02,
 };
 
-static const float
-one = 1.0,
-huge = 1.0e30;
-
 float atanf(float x)
 {
-       float w,s1,s2,z;
-       int32_t ix,hx,id;
+       float_t w,s1,s2,z;
+       uint32_t ix,sign;
+       int id;
 
-       GET_FLOAT_WORD(hx, x);
-       ix = hx & 0x7fffffff;
+       GET_FLOAT_WORD(ix, x);
+       sign = ix>>31;
+       ix &= 0x7fffffff;
        if (ix >= 0x4c800000) {  /* if |x| >= 2**26 */
-               if (ix > 0x7f800000)  /* NaN */
-                       return x+x;
-               if (hx > 0)
-                       return  atanhi[3] + *(volatile float *)&atanlo[3];
-               else
-                       return -atanhi[3] - *(volatile float *)&atanlo[3];
+               if (isnan(x))
+                       return x;
+               z = atanhi[3] + 0x1p-120f;
+               return sign ? -z : z;
        }
        if (ix < 0x3ee00000) {   /* |x| < 0.4375 */
                if (ix < 0x39800000) {  /* |x| < 2**-12 */
-                       /* raise inexact */
-                       if(huge+x>one)
-                               return x;
+                       /* raise inexact if x!=0 */
+                       FORCE_EVAL(x + 0x1p120f);
+                       return x;
                }
                id = -1;
        } else {
@@ -69,15 +65,15 @@ float atanf(float x)
                if (ix < 0x3f980000) {  /* |x| < 1.1875 */
                        if (ix < 0x3f300000) {  /*  7/16 <= |x| < 11/16 */
                                id = 0;
-                               x = (2.0f*x - one)/(2.0f + x);
+                               x = (2.0f*x - 1.0f)/(2.0f + x);
                        } else {                /* 11/16 <= |x| < 19/16 */
                                id = 1;
-                               x = (x - one)/(x + one);
+                               x = (x - 1.0f)/(x + 1.0f);
                        }
                } else {
                        if (ix < 0x401c0000) {  /* |x| < 2.4375 */
                                id = 2;
-                               x = (x - 1.5f)/(one + 1.5f*x);
+                               x = (x - 1.5f)/(1.0f + 1.5f*x);
                        } else {                /* 2.4375 <= |x| < 2**26 */
                                id = 3;
                                x = -1.0f/x;
@@ -93,5 +89,5 @@ float atanf(float x)
        if (id < 0)
                return x - x*(s1+s2);
        z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
-       return hx < 0 ? -z : z;
+       return sign ? -z : z;
 }