]> sourceware.org Git - glibc.git/commitdiff
Do not raise "inexact" from generic floor (bug 15479).
authorJoseph Myers <joseph@codesourcery.com>
Tue, 24 May 2016 17:44:46 +0000 (17:44 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Tue, 24 May 2016 17:44:46 +0000 (17:44 +0000)
C99 and C11 allow but do not require ceil, floor, round and trunc to
raise the "inexact" exception for noninteger arguments.  TS 18661-1
requires that this exception not be raised by these functions.  This
aligns them with general IEEE semantics, where "inexact" is only
raised if the final step of rounding the infinite-precision result to
the result type is inexact; for these functions, the
infinite-precision integer result is always representable in the
result type, so "inexact" should never be raised.

The generic implementations of ceil, floor and round functions contain
code to force "inexact" to be raised.  This patch removes it for floor
functions to align them with TS 18661-1 in this regard.  Note that
some architecture-specific versions may still raise "inexact", so the
tests are not updated and the bug is not yet fixed.

Tested for x86_64, x86 and mips64.

[BZ #15479]
* sysdeps/ieee754/dbl-64/s_floor.c: Do not mention "inexact"
exception in comment.
(huge): Remove variable.
(__floor): Do not force "inexact" exception.
* sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c: Do not mention
"inexact" exception in comment.
(huge): Remove variable.
(__floor): Do not force "inexact" exception.
* sysdeps/ieee754/flt-32/s_floorf.c: Do not mention "inexact"
exception in comment.
(huge): Remove variable.
(__floorf): Do not force "inexact" exception.
* sysdeps/ieee754/ldbl-128/s_floorl.c: Do not mention "inexact"
exception in comment.
(huge): Remove variable.
(__floorl): Do not force "inexact" exception.

ChangeLog
sysdeps/ieee754/dbl-64/s_floor.c
sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c
sysdeps/ieee754/flt-32/s_floorf.c
sysdeps/ieee754/ldbl-128/s_floorl.c

index b074f4d98071a6fcd18a2df6a64b4390061b4f5f..7837544563ed779b0a72e7368c3f27963428947a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
 2016-05-24  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #15479]
+       * sysdeps/ieee754/dbl-64/s_floor.c: Do not mention "inexact"
+       exception in comment.
+       (huge): Remove variable.
+       (__floor): Do not force "inexact" exception.
+       * sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c: Do not mention
+       "inexact" exception in comment.
+       (huge): Remove variable.
+       (__floor): Do not force "inexact" exception.
+       * sysdeps/ieee754/flt-32/s_floorf.c: Do not mention "inexact"
+       exception in comment.
+       (huge): Remove variable.
+       (__floorf): Do not force "inexact" exception.
+       * sysdeps/ieee754/ldbl-128/s_floorl.c: Do not mention "inexact"
+       exception in comment.
+       (huge): Remove variable.
+       (__floorl): Do not force "inexact" exception.
+
        [BZ #15479]
        * sysdeps/ieee754/dbl-64/s_ceil.c: Do not mention "inexact"
        exception in comment.
index bd6afa72e8cd7e0fc069dd6aac26f14fd8c2d9d2..8f86aa31ee294e4fc8b22fa5909cb58eeea35d9d 100644 (file)
  * Return x rounded toward -inf to integral value
  * Method:
  *     Bit twiddling.
- * Exception:
- *     Inexact flag raised if x not equal to floor(x).
  */
 
 #include <math.h>
 #include <math_private.h>
 
-static const double huge = 1.0e300;
-
 double
 __floor (double x)
 {
@@ -33,9 +29,9 @@ __floor (double x)
   j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
   if (j0 < 20)
     {
-      if (j0 < 0)       /* raise inexact if x != 0 */
+      if (j0 < 0)
        {
-         math_force_eval (huge + x);   /* return 0*sign(x) if |x|<1 */
+         /* return 0*sign(x) if |x|<1 */
          if (i0 >= 0)
            {
              i0 = i1 = 0;
@@ -50,7 +46,6 @@ __floor (double x)
          i = (0x000fffff) >> j0;
          if (((i0 & i) | i1) == 0)
            return x;                        /* x is integral */
-         math_force_eval (huge + x);           /* raise inexact flag */
          if (i0 < 0)
            i0 += (0x00100000) >> j0;
          i0 &= (~i); i1 = 0;
@@ -68,7 +63,6 @@ __floor (double x)
       i = ((u_int32_t) (0xffffffff)) >> (j0 - 20);
       if ((i1 & i) == 0)
        return x;                       /* x is integral */
-      math_force_eval (huge + x);               /* raise inexact flag */
       if (i0 < 0)
        {
          if (j0 == 20)
index b7ed14bfa2845d0c6f9c72f476a42180bcdf49a5..8d514f23bc4a32facce5a9dd50168f78068bafdc 100644 (file)
  * Return x rounded toward -inf to integral value
  * Method:
  *     Bit twiddling.
- * Exception:
- *     Inexact flag raised if x not equal to floor(x).
  */
 
-static const double huge = 1.0e300;
-
 
 double
 __floor (double x)
@@ -53,15 +49,14 @@ __floor (double x)
        EXTRACT_WORDS64(i0,x);
        int32_t j0 = ((i0>>52)&0x7ff)-0x3ff;
        if(__builtin_expect(j0<52, 1)) {
-           if(j0<0) {  /* raise inexact if x != 0 */
-               math_force_eval(huge+x);/* return 0*sign(x) if |x|<1 */
+           if(j0<0) {
+               /* return 0*sign(x) if |x|<1 */
                if(i0>=0) {i0=0;}
                else if((i0&0x7fffffffffffffffl)!=0)
                  { i0=0xbff0000000000000l;}
            } else {
                uint64_t i = (0x000fffffffffffffl)>>j0;
                if((i0&i)==0) return x; /* x is integral */
-               math_force_eval(huge+x);        /* raise inexact flag */
                if(i0<0) i0 += (0x0010000000000000l)>>j0;
                i0 &= (~i);
            }
index 99d6c018331c4bcbe24af7b2830ce83ea22f1f71..69160e5e10f0682c97818dbc444ad2ef63907763 100644 (file)
  * Return x rounded toward -inf to integral value
  * Method:
  *     Bit twiddling.
- * Exception:
- *     Inexact flag raised if x not equal to floorf(x).
  */
 
 #include <math.h>
 #include <math_private.h>
 
-static const float huge = 1.0e30;
-
 float
 __floorf(float x)
 {
@@ -35,15 +31,14 @@ __floorf(float x)
        GET_FLOAT_WORD(i0,x);
        j0 = ((i0>>23)&0xff)-0x7f;
        if(j0<23) {
-           if(j0<0) {  /* raise inexact if x != 0 */
-               math_force_eval(huge+x);/* return 0*sign(x) if |x|<1 */
+           if(j0<0) {
+               /* return 0*sign(x) if |x|<1 */
                if(i0>=0) {i0=0;}
                else if((i0&0x7fffffff)!=0)
                  { i0=0xbf800000;}
            } else {
                i = (0x007fffff)>>j0;
                if((i0&i)==0) return x; /* x is integral */
-               math_force_eval(huge+x);        /* raise inexact flag */
                if(i0<0) i0 += (0x00800000)>>j0;
                i0 &= (~i);
            }
index c72d5d433078e9ce320dd337247740ccec6cb014..14a0efef85d87b73ead9ef5955f1d04e1bedecc6 100644 (file)
@@ -22,15 +22,11 @@ static char rcsid[] = "$NetBSD: $";
  * Return x rounded toward -inf to integral value
  * Method:
  *     Bit twiddling.
- * Exception:
- *     Inexact flag raised if x not equal to floor(x).
  */
 
 #include <math.h>
 #include <math_private.h>
 
-static const long double huge = 1.0e4930L;
-
 long double __floorl(long double x)
 {
        int64_t i0,i1,j0;
@@ -38,19 +34,16 @@ long double __floorl(long double x)
        GET_LDOUBLE_WORDS64(i0,i1,x);
        j0 = ((i0>>48)&0x7fff)-0x3fff;
        if(j0<48) {
-           if(j0<0) {  /* raise inexact if x != 0 */
-               if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
-                   if(i0>=0) {i0=i1=0;}
-                   else if(((i0&0x7fffffffffffffffLL)|i1)!=0)
-                       { i0=0xbfff000000000000ULL;i1=0;}
-               }
+           if(j0<0) {
+               /* return 0*sign(x) if |x|<1 */
+               if(i0>=0) {i0=i1=0;}
+               else if(((i0&0x7fffffffffffffffLL)|i1)!=0)
+                   { i0=0xbfff000000000000ULL;i1=0;}
            } else {
                i = (0x0000ffffffffffffULL)>>j0;
                if(((i0&i)|i1)==0) return x; /* x is integral */
-               if(huge+x>0.0) {        /* raise inexact flag */
-                   if(i0<0) i0 += (0x0001000000000000LL)>>j0;
-                   i0 &= (~i); i1=0;
-               }
+               if(i0<0) i0 += (0x0001000000000000LL)>>j0;
+               i0 &= (~i); i1=0;
            }
        } else if (j0>111) {
            if(j0==0x4000) return x+x;  /* inf or NaN */
@@ -58,17 +51,15 @@ long double __floorl(long double x)
        } else {
            i = -1ULL>>(j0-48);
            if((i1&i)==0) return x;     /* x is integral */
-           if(huge+x>0.0) {            /* raise inexact flag */
-               if(i0<0) {
-                   if(j0==48) i0+=1;
-                   else {
-                       j = i1+(1LL<<(112-j0));
-                       if(j<i1) i0 +=1 ;       /* got a carry */
-                       i1=j;
-                   }
+           if(i0<0) {
+               if(j0==48) i0+=1;
+               else {
+                   j = i1+(1LL<<(112-j0));
+                   if(j<i1) i0 +=1 ;   /* got a carry */
+                   i1=j;
                }
-               i1 &= (~i);
            }
+           i1 &= (~i);
        }
        SET_LDOUBLE_WORDS64(x,i0,i1);
        return x;
This page took 0.202329 seconds and 5 git commands to generate.