remove cruft for supposedly-buggy clang from or1k & microblaze syscall_arch
[musl.git] / src / math / rint.c
blobfbba390e7d723774d41ba2a9da74957c20643d63
1 #include <float.h>
2 #include <math.h>
3 #include <stdint.h>
5 #if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
6 #define EPS DBL_EPSILON
7 #elif FLT_EVAL_METHOD==2
8 #define EPS LDBL_EPSILON
9 #endif
10 static const double_t toint = 1/EPS;
12 double rint(double x)
14 union {double f; uint64_t i;} u = {x};
15 int e = u.i>>52 & 0x7ff;
16 int s = u.i>>63;
17 double_t y;
19 if (e >= 0x3ff+52)
20 return x;
21 if (s)
22 y = x - toint + toint;
23 else
24 y = x + toint - toint;
25 if (y == 0)
26 return s ? -0.0 : 0;
27 return y;