diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-03-13 12:56:58 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-03-13 12:56:58 -0400 |
| commit | 54edbc6815e42457cd28fa9f1b94e732504b3fc9 (patch) | |
| tree | 36c97169bf0cd59326a93b8c3c0d458f94aed8a9 /libc/musl/src/math/rint.c | |
| parent | 4cb55d3af6a71467b7d4399bedb961c81e9ad3d5 (diff) | |
| parent | d495dcc3c952c99e5358d9610cf09eb856f643b0 (diff) | |
| download | zig-54edbc6815e42457cd28fa9f1b94e732504b3fc9.tar.gz zig-54edbc6815e42457cd28fa9f1b94e732504b3fc9.zip | |
Merge remote-tracking branch 'origin/master' into llvm8
Diffstat (limited to 'libc/musl/src/math/rint.c')
| -rw-r--r-- | libc/musl/src/math/rint.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/libc/musl/src/math/rint.c b/libc/musl/src/math/rint.c new file mode 100644 index 0000000000..fbba390e7d --- /dev/null +++ b/libc/musl/src/math/rint.c @@ -0,0 +1,28 @@ +#include <float.h> +#include <math.h> +#include <stdint.h> + +#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 +#define EPS DBL_EPSILON +#elif FLT_EVAL_METHOD==2 +#define EPS LDBL_EPSILON +#endif +static const double_t toint = 1/EPS; + +double rint(double x) +{ + union {double f; uint64_t i;} u = {x}; + int e = u.i>>52 & 0x7ff; + int s = u.i>>63; + double_t y; + + if (e >= 0x3ff+52) + return x; + if (s) + y = x - toint + toint; + else + y = x + toint - toint; + if (y == 0) + return s ? -0.0 : 0; + return y; +} |
