1 #include <float.h>
2 #include <math.h>
3 #include <stdint.h>
4 
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;
11 
rint(double x)12 double rint(double x)
13 {
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;
18 
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;
28 }
29