diff options
Diffstat (limited to 'libm/upstream-freebsd/lib/msun/src/s_roundl.c')
-rw-r--r-- | libm/upstream-freebsd/lib/msun/src/s_roundl.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/libm/upstream-freebsd/lib/msun/src/s_roundl.c b/libm/upstream-freebsd/lib/msun/src/s_roundl.c index a70b617..2d15e13 100644 --- a/libm/upstream-freebsd/lib/msun/src/s_roundl.c +++ b/libm/upstream-freebsd/lib/msun/src/s_roundl.c @@ -27,25 +27,36 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include <math.h> +#include <float.h> +#ifdef __i386__ +#include <ieeefp.h> +#endif + +#include "fpmath.h" +#include "math.h" +#include "math_private.h" long double roundl(long double x) { long double t; + uint16_t hx; + + GET_LDBL_EXPSIGN(hx, x); + if ((hx & 0x7fff) == 0x7fff) + return (x + x); - if (!isfinite(x)) - return (x); + ENTERI(); - if (x >= 0.0) { + if (!(hx & 0x8000)) { t = floorl(x); - if (t - x <= -0.5) - t += 1.0; - return (t); + if (t - x <= -0.5L) + t += 1; + RETURNI(t); } else { t = floorl(-x); - if (t + x <= -0.5) - t += 1.0; - return (-t); + if (t + x <= -0.5L) + t += 1; + RETURNI(-t); } } |