1 /* 2 * ==================================================== 3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 4 * 5 * Developed at SunPro, a Sun Microsystems, Inc. business. 6 * Permission to use, copy, modify, and distribute this 7 * software is freely granted, provided that this notice 8 * is preserved. 9 * ==================================================== 10 */ 11 12 /* 13 * truncf(x) 14 * Return x rounded toward 0 to integral value 15 * Method: 16 * Bit twiddling. 17 * Exception: 18 * Inexact flag raised if x not equal to truncf(x). 19 */ 20 21 #include "math.h" 22 #include "math_private.h" 23 24 static const float huge = 1.0e30F; 25 26 float 27 truncf(float x) 28 { 29 int32_t i0,j0; 30 u_int32_t i; 31 GET_FLOAT_WORD(i0,x); 32 j0 = ((i0>>23)&0xff)-0x7f; 33 if(j0<23) { 34 if(j0<0) { /* raise inexact if x != 0 */ 35 if(huge+x>0.0F) /* |x|<1, so return 0*sign(x) */ 36 i0 &= 0x80000000; 37 } else { 38 i = (0x007fffff)>>j0; 39 if((i0&i)==0) return x; /* x is integral */ 40 if(huge+x>0.0F) /* raise inexact flag */ 41 i0 &= (~i); 42 } 43 } else { 44 if(j0==0x80) return x+x; /* inf or NaN */ 45 else return x; /* x is integral */ 46 } 47 SET_FLOAT_WORD(x,i0); 48 return x; 49 } 50