1b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
2b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* @(#)s_ilogb.c 1.3 95/01/18 */
3b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/*
4b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ====================================================
5b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *
7b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Developed at SunSoft, a Sun Microsystems, Inc. business.
8b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Permission to use, copy, modify, and distribute this
9b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * software is freely granted, provided that this notice
10b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * is preserved.
11b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ====================================================
12b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project */
13b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
14b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* ieee_ilogb(double x)
15b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * return the binary exponent of non-zero x
16b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ieee_ilogb(0) = 0x80000001
17b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ieee_ilogb(inf/NaN) = 0x7fffffff (no signal is raised)
18b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project */
19b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
20b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#include "fdlibm.h"
21b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
22b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#ifdef __STDC__
23b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	int ieee_ilogb(double x)
24b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#else
25b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	int ieee_ilogb(x)
26b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	double x;
27b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#endif
28b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project{
29b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	int hx,lx,ix;
30b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project
31b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	hx  = (__HI(x))&0x7fffffff;	/* high word of x */
32b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	if(hx<0x00100000) {
33b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	    lx = __LO(x);
34b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	    if((hx|lx)==0)
35b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project		return 0x80000001;	/* ieee_ilogb(0) = 0x80000001 */
36b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	    else			/* subnormal x */
37b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project		if(hx==0) {
38b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project		    for (ix = -1043; lx>0; lx<<=1) ix -=1;
39b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project		} else {
40b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project		    for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1;
41b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project		}
42b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	    return ix;
43b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	}
44b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	else if (hx<0x7ff00000) return (hx>>20)-1023;
45b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project	else return 0x7fffffff;
46b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project}
47