OSDN Git Service

libm: fix testuite failure in modf
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 30 Oct 2010 18:19:20 +0000 (20:19 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 30 Oct 2010 18:19:20 +0000 (20:19 +0200)
This error is gone:
Failure: Test: modf (NaN, &x) == NaN
Result:
 is:         -0.00000000000000000000e+00  -0
 should be:   nan   nan

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libm/float_wrappers.c
libm/s_modf.c

index a13aac9..82b7963 100644 (file)
@@ -293,10 +293,9 @@ long_WRAPPER1(lround)
 float modff (float x, float *iptr)
 {
        double y, result;
-       result = modf ( x, &y );
+       result = modf( x, &y );
        *iptr = (float)y;
        return (float) result;
-
 }
 #endif
 
index 26c2f1c..f73d5fd 100644 (file)
@@ -37,10 +37,8 @@ double modf(double x, double *iptr)
            } else {
                i = (0x000fffff)>>j0;
                if(((i0&i)|i1)==0) {            /* x is integral */
-                   u_int32_t high;
                    *iptr = x;
-                   GET_HIGH_WORD(high,x);
-                   INSERT_WORDS(x,high&0x80000000,0);  /* return +-0 */
+                   INSERT_WORDS(x,i0&0x80000000,0);    /* return +-0 */
                    return x;
                } else {
                    INSERT_WORDS(*iptr,i0&(~i),0);
@@ -48,18 +46,17 @@ double modf(double x, double *iptr)
                }
            }
        } else if (j0>51) {             /* no fraction part */
-           u_int32_t high;
            *iptr = x*one;
-           GET_HIGH_WORD(high,x);
-           INSERT_WORDS(x,high&0x80000000,0);  /* return +-0 */
+           /* We must handle NaNs separately.  */
+           if (j0 == 0x400 && ((i0 & 0xfffff) | i1))
+             return x*one;
+           INSERT_WORDS(x,i0&0x80000000,0);    /* return +-0 */
            return x;
        } else {                        /* fraction part in low x */
            i = ((u_int32_t)(0xffffffff))>>(j0-20);
            if((i1&i)==0) {             /* x is integral */
-               u_int32_t high;
                *iptr = x;
-               GET_HIGH_WORD(high,x);
-               INSERT_WORDS(x,high&0x80000000,0);      /* return +-0 */
+               INSERT_WORDS(x,i0&0x80000000,0);        /* return +-0 */
                return x;
            } else {
                INSERT_WORDS(*iptr,i0,i1&(~i));