Library: add round and roundf
authorAlan Cox <alan@linux.intel.com>
Sat, 30 Sep 2017 19:12:07 +0000 (20:12 +0100)
committerAlan Cox <alan@linux.intel.com>
Sat, 30 Sep 2017 19:12:07 +0000 (20:12 +0100)
Library/libs/round.c
Library/libs/roundf.c [new file with mode: 0644]

index 9087566..edf3316 100644 (file)
@@ -14,8 +14,8 @@
 double round(double x)
 {
        /* Most significant word, least significant word. */
-       __int32_t msw, exponent_less_1023;
-       __uint32_t lsw;
+       int32_t msw, exponent_less_1023;
+       uint32_t lsw;
 
        EXTRACT_WORDS(msw, lsw, x);
 
@@ -30,7 +30,7 @@ double round(double x)
                                msw |= (1023 << 20);
                        lsw = 0;
                } else {
-                       __uint32_t exponent_mask = 0x000fffff >> exponent_less_1023;
+                       uint32_t exponent_mask = 0x000fffff >> exponent_less_1023;
                        if ((msw & exponent_mask) == 0 && lsw == 0)
                                /* x in an integral value. */
                                return x;
@@ -46,8 +46,8 @@ double round(double x)
                else
                        return x;
        } else {
-               __uint32_t exponent_mask = 0xffffffff >> (exponent_less_1023 - 20);
-               __uint32_t tmp;
+               uint32_t exponent_mask = 0xffffffff >> (exponent_less_1023 - 20);
+               uint32_t tmp;
 
                if ((lsw & exponent_mask) == 0)
                        /* x is an integral value. */
diff --git a/Library/libs/roundf.c b/Library/libs/roundf.c
new file mode 100644 (file)
index 0000000..9386b28
--- /dev/null
@@ -0,0 +1,46 @@
+/* Round float to integer away from zero.
+   Copyright (C) 1997-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   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, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "libm.h"
+
+float roundf(float x)
+{
+       int32_t i0, j0;
+       GET_FLOAT_WORD(i0, x);
+       j0 = ((i0 >> 23) & 0xff) - 0x7f;
+       if (j0 < 23) {
+               if (j0 < 0) {
+                       i0 &= 0x80000000;
+                       if (j0 == -1)
+                               i0 |= 0x3f800000;
+               } else {
+                       uint32_t i = 0x007fffff >> j0;
+                       if ((i0 & i) == 0)
+                               /* X is integral.  */
+                               return x;
+                       i0 += 0x00400000 >> j0;
+                       i0 &= ~i;
+               }
+       } else {
+               if (j0 == 0x80)
+                       /* Inf or NaN.  */
+                       return x + x;
+               else
+                       return x;
+       }
+       SET_FLOAT_WORD(x, i0);
+       return x;
+}