]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/ieee754/ldbl-96/s_roundl.c
Prefer https to http for gnu.org and fsf.org URLs
[thirdparty/glibc.git] / sysdeps / ieee754 / ldbl-96 / s_roundl.c
index 672536d35893d0a05b4e673798bd31bdbb69ae0b..9c2116241f1a5e24e267f13c17adaa7a22ec77fe 100644 (file)
@@ -1,5 +1,5 @@
 /* Round long double to integer away from zero.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+   Copyright (C) 1997-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
 
+#define NO_MATH_REDIRECT
 #include <math.h>
 
-#include "math_private.h"
-
-
-static const long double huge = 1.0e4930;
+#include <math_private.h>
+#include <libm-alias-ldouble.h>
 
 
 long double
 __roundl (long double x)
 {
   int32_t j0;
-  u_int32_t se, i1, i0;
+  uint32_t se, i1, i0;
 
   GET_LDOUBLE_WORDS (se, i0, i1, x);
   j0 = (se & 0x7fff) - 0x3fff;
@@ -38,32 +36,26 @@ __roundl (long double x)
     {
       if (j0 < 0)
        {
-         if (huge + x > 0.0)
+         se &= 0x8000;
+         i0 = i1 = 0;
+         if (j0 == -1)
            {
-             se &= 0x8000;
-             i0 = i1 = 0;
-             if (j0 == -1)
-               {
-                 se |= 0x3fff;
-                 i0 = 0x80000000;
-               }
+             se |= 0x3fff;
+             i0 = 0x80000000;
            }
        }
       else
        {
-         u_int32_t i = 0x7fffffff >> j0;
+         uint32_t i = 0x7fffffff >> j0;
          if (((i0 & i) | i1) == 0)
            /* X is integral.  */
            return x;
-         if (huge + x > 0.0)
-           {
-             /* Raise inexact if x != 0.  */
-             u_int32_t j = i0 + (0x40000000 >> j0);
-             if (j < i0)
-               se += 1;
-             i0 = (j & ~i) | 0x80000000;
-             i1 = 0;
-           }
+
+         uint32_t j = i0 + (0x40000000 >> j0);
+         if (j < i0)
+           se += 1;
+         i0 = (j & ~i) | 0x80000000;
+         i1 = 0;
        }
     }
   else if (j0 > 62)
@@ -76,31 +68,27 @@ __roundl (long double x)
     }
   else
     {
-      u_int32_t i = 0xffffffff >> (j0 - 31);
+      uint32_t i = 0xffffffff >> (j0 - 31);
       if ((i1 & i) == 0)
        /* X is integral.  */
        return x;
 
-      if (huge + x > 0.0)
+      uint32_t j = i1 + (1 << (62 - j0));
+      if (j < i1)
        {
-         /* Raise inexact if x != 0.  */
-         u_int32_t j = i1 + (1 << (62 - j0));
-         if (j < i1)
+         uint32_t k = i0 + 1;
+         if (k < i0)
            {
-             u_int32_t k = i0 + 1;
-             if (k < i0)
-               {
-                 se += 1;
-                 k |= 0x80000000;
-               }
-             i0 = k;
+             se += 1;
+             k |= 0x80000000;
            }
-         i1 = j;
+         i0 = k;
        }
+      i1 = j;
       i1 &= ~i;
     }
 
   SET_LDOUBLE_WORDS (x, se, i0, i1);
   return x;
 }
-weak_alias (__roundl, roundl)
+libm_alias_ldouble (__round, round)