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);
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;
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. */
--- /dev/null
+/* 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;
+}