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