fix struct layout mismatch in sound ioctl time32 fallback conversion
[musl.git] / src / math / rintf.c
blob9047688d246a69c2698ce27399135e1db7ac2f65
1 #include <float.h>
2 #include <math.h>
3 #include <stdint.h>
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;
14 float rintf(float x)
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;
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;