diff options
author | Elliott Hughes <enh@google.com> | 2014-10-10 10:21:43 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-10-10 10:21:43 -0700 |
commit | 14538ca75ef3d0edc8fb86e332d79a4913238cb6 (patch) | |
tree | fc02d348aa55a1a9191d4edd9619583ee742b5bb /libm | |
parent | 8dd3b65f2dd63df1baa83285f607cf110f21c27c (diff) | |
download | bionic-14538ca75ef3d0edc8fb86e332d79a4913238cb6.zip bionic-14538ca75ef3d0edc8fb86e332d79a4913238cb6.tar.gz bionic-14538ca75ef3d0edc8fb86e332d79a4913238cb6.tar.bz2 |
Catch up on upstream's round/roundf/roundl.
Not sure how we missed these, but better late than never...
Change-Id: Ib08d1bb6e340a1907cbeb1cbe220e33f70642bdc
Diffstat (limited to 'libm')
-rw-r--r-- | libm/upstream-freebsd/lib/msun/src/s_round.c | 21 | ||||
-rw-r--r-- | libm/upstream-freebsd/lib/msun/src/s_roundf.c | 19 | ||||
-rw-r--r-- | libm/upstream-freebsd/lib/msun/src/s_roundl.c | 31 |
3 files changed, 47 insertions, 24 deletions
diff --git a/libm/upstream-freebsd/lib/msun/src/s_round.c b/libm/upstream-freebsd/lib/msun/src/s_round.c index 65de31b..fab3019 100644 --- a/libm/upstream-freebsd/lib/msun/src/s_round.c +++ b/libm/upstream-freebsd/lib/msun/src/s_round.c @@ -27,25 +27,34 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include <math.h> +#include <float.h> + +#include "math.h" +#include "math_private.h" double round(double x) { double t; + uint32_t hx; - if (!isfinite(x)) - return (x); + GET_HIGH_WORD(hx, x); + if ((hx & 0x7fffffff) == 0x7ff00000) + return (x + x); - if (x >= 0.0) { + if (!(hx & 0x80000000)) { t = floor(x); if (t - x <= -0.5) - t += 1.0; + t += 1; return (t); } else { t = floor(-x); if (t + x <= -0.5) - t += 1.0; + t += 1; return (-t); } } + +#if (LDBL_MANT_DIG == 53) +__weak_reference(round, roundl); +#endif diff --git a/libm/upstream-freebsd/lib/msun/src/s_roundf.c b/libm/upstream-freebsd/lib/msun/src/s_roundf.c index 952e8e7..e7e2eb9 100644 --- a/libm/upstream-freebsd/lib/msun/src/s_roundf.c +++ b/libm/upstream-freebsd/lib/msun/src/s_roundf.c @@ -27,25 +27,28 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include <math.h> +#include "math.h" +#include "math_private.h" float roundf(float x) { float t; + uint32_t hx; - if (!isfinite(x)) - return (x); + GET_FLOAT_WORD(hx, x); + if ((hx & 0x7fffffff) == 0x7f800000) + return (x + x); - if (x >= 0.0) { + if (!(hx & 0x80000000)) { t = floorf(x); - if (t - x <= -0.5) - t += 1.0; + if (t - x <= -0.5F) + t += 1; return (t); } else { t = floorf(-x); - if (t + x <= -0.5) - t += 1.0; + if (t + x <= -0.5F) + t += 1; return (-t); } } 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); } } |