math: fix exception behaviour of expm1l.c on inf and nan
[musl] / src / math / logf.c
index 285ee61..c7f7dbe 100644 (file)
@@ -25,8 +25,6 @@ Lg2 = 0xccce13.0p-25, /* 0.40000972152 */
 Lg3 = 0x91e9ee.0p-25, /* 0.28498786688 */
 Lg4 = 0xf89e26.0p-26; /* 0.24279078841 */
 
-static const float zero = 0.0;
-
 float logf(float x)
 {
        float hfsq,f,s,z,R,w,t1,t2,dk;
@@ -37,9 +35,9 @@ float logf(float x)
        k = 0;
        if (ix < 0x00800000) {  /* x < 2**-126  */
                if ((ix & 0x7fffffff) == 0)
-                       return -two25/zero;  /* log(+-0)=-inf */
+                       return -two25/0.0f;  /* log(+-0)=-inf */
                if (ix < 0)
-                       return (x-x)/zero;   /* log(-#) = NaN */
+                       return (x-x)/0.0f;   /* log(-#) = NaN */
                /* subnormal number, scale up x */
                k -= 25;
                x *= two25;
@@ -52,21 +50,21 @@ float logf(float x)
        i = (ix + (0x95f64<<3)) & 0x800000;
        SET_FLOAT_WORD(x, ix|(i^0x3f800000));  /* normalize x or x/2 */
        k += i>>23;
-       f = x - (float)1.0;
+       f = x - 1.0f;
        if ((0x007fffff & (0x8000 + ix)) < 0xc000) {  /* -2**-9 <= f < 2**-9 */
-               if (f == zero) {
+               if (f == 0.0f) {
                        if (k == 0)
-                               return zero;
+                               return 0.0f;
                        dk = (float)k;
                        return dk*ln2_hi + dk*ln2_lo;
                }
-               R = f*f*((float)0.5 - (float)0.33333333333333333*f);
+               R = f*f*(0.5f - 0.33333333333333333f*f);
                if (k == 0)
                        return f-R;
                dk = (float)k;
                return dk*ln2_hi - ((R-dk*ln2_lo)-f);
        }
-       s = f/((float)2.0+f);
+       s = f/(2.0f + f);
        dk = (float)k;
        z = s*s;
        i = ix-(0x6147a<<3);
@@ -77,7 +75,7 @@ float logf(float x)
        i |= j;
        R = t2 + t1;
        if (i > 0) {
-               hfsq = (float)0.5*f*f;
+               hfsq = 0.5f * f * f;
                if (k == 0)
                        return f - (hfsq-s*(hfsq+R));
                return dk*ln2_hi - ((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f);