From 91bef340af4315f9edf7ad86cc03569e1cc0cb7c Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sat, 30 Sep 2017 20:12:07 +0100 Subject: [PATCH] Library: add round and roundf --- Library/libs/round.c | 10 +++++----- Library/libs/roundf.c | 46 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 Library/libs/roundf.c diff --git a/Library/libs/round.c b/Library/libs/round.c index 90875660..edf3316b 100644 --- a/Library/libs/round.c +++ b/Library/libs/round.c @@ -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 index 00000000..9386b289 --- /dev/null +++ b/Library/libs/roundf.c @@ -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 , 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 + . */ + +#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; +} -- 2.34.1