1: 2: 3:
4:
5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15:
16: #include "math.h"
17: #include "math_private.h"
18:
19: static const float
20: TWO23[2]={
21: 8.3886080000e+06,
22: -8.3886080000e+06,
23: };
24:
25: float
26: rintf(float x)
27: {
28: int32_t i0,jj0,sx;
29: u_int32_t i,i1;
30: float t;
31: volatile float w;
32: GET_FLOAT_WORD(i0,x);
33: sx = (i0>>31)&1;
34: jj0 = ((i0>>23)&0xff)-0x7f;
35: if(jj0<23) {
36: if(jj0<0) {
37: if((i0&0x7fffffff)==0) return x;
38: i1 = (i0&0x07fffff);
39: i0 &= 0xfff00000;
40: i0 |= ((i1|-i1)>>9)&0x400000;
41: SET_FLOAT_WORD(x,i0);
42: w = TWO23[sx]+x;
43: t = w-TWO23[sx];
44: GET_FLOAT_WORD(i0,t);
45: SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
46: return t;
47: } else {
48: i = (0x007fffff)>>jj0;
49: if((i0&i)==0) return x;
50: i>>=1;
51: if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>jj0);
52: }
53: } else {
54: if(jj0==0x80) return x+x;
55: else return x;
56: }
57: SET_FLOAT_WORD(x,i0);
58: w = TWO23[sx]+x;
59: return w-TWO23[sx];
60: }