xref: /netbsd-src/lib/libm/src/s_ilogbf.c (revision 92e958de60c71aa0f2452bd7074cbb006fe6546b)
1 /* s_ilogbf.c -- float version of s_ilogb.c.
2  * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3  */
4 
5 /*
6  * ====================================================
7  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8  *
9  * Developed at SunPro, a Sun Microsystems, Inc. business.
10  * Permission to use, copy, modify, and distribute this
11  * software is freely granted, provided that this notice
12  * is preserved.
13  * ====================================================
14  */
15 
16 #include <sys/cdefs.h>
17 #if defined(LIBM_SCCS) && !defined(lint)
18 __RCSID("$NetBSD: s_ilogbf.c,v 1.9 2016/08/24 10:03:32 christos Exp $");
19 #endif
20 
21 #include <math.h>
22 #include <fenv.h>
23 #include "math_private.h"
24 
25 int
26 ilogbf(float x)
27 {
28 	int32_t hx, ix;
29 
30 	GET_FLOAT_WORD(hx, x);
31 	hx &= 0x7fffffff;
32 	if (hx < 0x00800000) {
33 		if (hx == 0) {
34 			feraiseexcept(FE_INVALID);
35 			return FP_ILOGB0;	/* ilogb(0) = 0x80000001 */
36 		}
37 		for (ix = -126, hx <<= 8; hx > 0; hx <<= 1) ix -= 1;
38 		return ix;
39 	}
40 
41 	if (hx < 0x7f800000) {
42 		return (hx >> 23) - 127;
43 	}
44 
45 	feraiseexcept(FE_INVALID);
46 	return isnan(x) ? FP_ILOGBNAN : INT_MAX;
47 }
48