xref: /netbsd/lib/libm/src/s_truncf.c (revision f1336fbd)
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