1 #include <float.h>
2 #include <math.h>
3 #include <stdint.h>
4 
5 #if FLT_EVAL_METHOD==0
6 #define EPS FLT_EPSILON
7 #elif FLT_EVAL_METHOD==1
8 #define EPS DBL_EPSILON
9 #elif FLT_EVAL_METHOD==2
10 #define EPS LDBL_EPSILON
11 #endif
12 static const float_t toint = 1/EPS;
13 
rintf(float x)14 float rintf(float x)
15 {
16 	union {float f; uint32_t i;} u = {x};
17 	int e = u.i>>23 & 0xff;
18 	int s = u.i>>31;
19 	float_t y;
20 
21 	if (e >= 0x7f+23)
22 		return x;
23 	if (s)
24 		y = x - toint + toint;
25 	else
26 		y = x + toint - toint;
27 	if (y == 0)
28 		return s ? -0.0f : 0.0f;
29 	return y;
30 }
31