1 /* Round float to integer away from zero. 2 Copyright (C) 1997-2022 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #define NO_MATH_REDIRECT 20 #include <math.h> 21 22 #include <math_private.h> 23 #include <libm-alias-float.h> 24 #include <math-use-builtins.h> 25 26 27 float __roundf(float x)28__roundf (float x) 29 { 30 #if USE_ROUNDF_BUILTIN 31 return __builtin_roundf (x); 32 #else 33 /* Use generic implementation. */ 34 int32_t i0, j0; 35 36 GET_FLOAT_WORD (i0, x); 37 j0 = ((i0 >> 23) & 0xff) - 0x7f; 38 if (j0 < 23) 39 { 40 if (j0 < 0) 41 { 42 i0 &= 0x80000000; 43 if (j0 == -1) 44 i0 |= 0x3f800000; 45 } 46 else 47 { 48 uint32_t i = 0x007fffff >> j0; 49 if ((i0 & i) == 0) 50 /* X is integral. */ 51 return x; 52 53 i0 += 0x00400000 >> j0; 54 i0 &= ~i; 55 } 56 } 57 else 58 { 59 if (j0 == 0x80) 60 /* Inf or NaN. */ 61 return x + x; 62 else 63 return x; 64 } 65 66 SET_FLOAT_WORD (x, i0); 67 return x; 68 #endif /* ! USE_ROUNDF_BUILTIN */ 69 } 70 libm_alias_float (__round, round) 71