OLD | NEW |
1 #include "libm.h" | 1 #include "libm.h" |
2 | 2 |
3 #if FLT_EVAL_METHOD==0 | 3 #if FLT_EVAL_METHOD == 0 |
4 #define EPS FLT_EPSILON | 4 #define EPS FLT_EPSILON |
5 #elif FLT_EVAL_METHOD==1 | 5 #elif FLT_EVAL_METHOD == 1 |
6 #define EPS DBL_EPSILON | 6 #define EPS DBL_EPSILON |
7 #elif FLT_EVAL_METHOD==2 | 7 #elif FLT_EVAL_METHOD == 2 |
8 #define EPS LDBL_EPSILON | 8 #define EPS LDBL_EPSILON |
9 #endif | 9 #endif |
10 static const float_t toint = 1/EPS; | 10 static const float_t toint = 1 / EPS; |
11 | 11 |
12 float roundf(float x) | 12 float roundf(float x) { |
13 { | 13 union { |
14 » union {float f; uint32_t i;} u = {x}; | 14 float f; |
15 » int e = u.i >> 23 & 0xff; | 15 uint32_t i; |
16 » float_t y; | 16 } u = {x}; |
| 17 int e = u.i >> 23 & 0xff; |
| 18 float_t y; |
17 | 19 |
18 » if (e >= 0x7f+23) | 20 if (e >= 0x7f + 23) |
19 » » return x; | 21 return x; |
20 » if (u.i >> 31) | 22 if (u.i >> 31) |
21 » » x = -x; | 23 x = -x; |
22 » if (e < 0x7f-1) { | 24 if (e < 0x7f - 1) { |
23 » » FORCE_EVAL(x + toint); | 25 FORCE_EVAL(x + toint); |
24 » » return 0*u.f; | 26 return 0 * u.f; |
25 » } | 27 } |
26 » y = x + toint - toint - x; | 28 y = x + toint - toint - x; |
27 » if (y > 0.5f) | 29 if (y > 0.5f) |
28 » » y = y + x - 1; | 30 y = y + x - 1; |
29 » else if (y <= -0.5f) | 31 else if (y <= -0.5f) |
30 » » y = y + x + 1; | 32 y = y + x + 1; |
31 » else | 33 else |
32 » » y = y + x; | 34 y = y + x; |
33 » if (u.i >> 31) | 35 if (u.i >> 31) |
34 » » y = -y; | 36 y = -y; |
35 » return y; | 37 return y; |
36 } | 38 } |
OLD | NEW |