Changeset 777 for soft/giet_vm/giet_libs/math/s_floor.c
- Timestamp:
- Feb 4, 2016, 6:25:22 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/giet_libs/math/s_floor.c
r581 r777 11 11 12 12 /* Modified for GIET-VM static OS at UPMC, France 2015. 13 13 */ 14 14 15 15 /* … … 28 28 double floor(double x) 29 29 { 30 int32_t i0,i1,j0; 31 u_int32_t i,j; 32 EXTRACT_WORDS(i0,i1,x); 33 j0 = ((i0>>20)&0x7ff)-0x3ff; 34 if(j0<20) { 35 if(j0<0) { /* raise inexact if x != 0 */ 36 if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */ 37 if(i0>=0) {i0=i1=0;} 38 else if(((i0&0x7fffffff)|i1)!=0) 39 { i0=0xbff00000;i1=0;} 40 } 41 } else { 42 i = (0x000fffff)>>j0; 43 if(((i0&i)|i1)==0) return x; /* x is integral */ 44 if(huge+x>0.0) { /* raise inexact flag */ 45 if(i0<0) i0 += (0x00100000)>>j0; 46 i0 &= (~i); i1=0; 47 } 48 } 49 } else if (j0>51) { 50 if(j0==0x400) return x+x; /* inf or NaN */ 51 else return x; /* x is integral */ 52 } else { 53 i = ((u_int32_t)(0xffffffff))>>(j0-20); 54 if((i1&i)==0) return x; /* x is integral */ 55 if(huge+x>0.0) { /* raise inexact flag */ 56 if(i0<0) { 57 if(j0==20) i0+=1; 58 else { 59 j = i1+(1<<(52-j0)); 60 if(j<i1) i0 +=1 ; /* got a carry */ 61 i1=j; 62 } 63 } 64 i1 &= (~i); 65 } 66 } 67 INSERT_WORDS(x,i0,i1); 68 return x; 30 int32_t i0, i1, j0; 31 uint32_t i, j; 32 EXTRACT_WORDS(i0, i1, x); 33 j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; 34 if (j0 < 20) { 35 if (j0 < 0) { /* raise inexact if x != 0 */ 36 if (huge + x > 0.0) {/* return 0*sign(x) if |x|<1 */ 37 if (i0 >= 0) { 38 i0 = i1 = 0; 39 } 40 else if (((i0 & 0x7fffffff) | i1) != 0) { 41 i0 = 0xbff00000; 42 i1 = 0; 43 } 44 } 45 } 46 else { 47 i = (0x000fffff) >> j0; 48 if (((i0 & i) | i1) == 0) { 49 return x; /* x is integral */ 50 } 51 if (huge + x > 0.0) { /* raise inexact flag */ 52 if (i0 < 0) { 53 i0 += (0x00100000) >> j0; 54 } 55 i0 &= (~i); 56 i1 = 0; 57 } 58 } 59 } 60 else if (j0 > 51) { 61 if (j0 == 0x400) { 62 return x + x; /* inf or NaN */ 63 } 64 else { 65 return x; /* x is integral */ 66 } 67 } 68 else { 69 i = ((uint32_t) (0xffffffff)) >> (j0 - 20); 70 if ((i1 & i)== 0) { 71 return x; /* x is integral */ 72 } 73 if (huge + x > 0.0) { /* raise inexact flag */ 74 if (i0 < 0) { 75 if (j0 == 20) { 76 i0 += 1; 77 } 78 else { 79 j = i1 + (1 << (52 - j0)); 80 if (j < i1) { 81 i0 += 1 ; /* got a carry */ 82 } 83 i1 = j; 84 } 85 } 86 i1 &= (~i); 87 } 88 } 89 INSERT_WORDS(x, i0, i1); 90 return x; 69 91 } 70 92
Note: See TracChangeset
for help on using the changeset viewer.