1df930be7Sderaadt /* s_frexpf.c -- float version of s_frexp.c.
2df930be7Sderaadt * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3df930be7Sderaadt */
4df930be7Sderaadt
5df930be7Sderaadt /*
6df930be7Sderaadt * ====================================================
7df930be7Sderaadt * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8df930be7Sderaadt *
9df930be7Sderaadt * Developed at SunPro, a Sun Microsystems, Inc. business.
10df930be7Sderaadt * Permission to use, copy, modify, and distribute this
11df930be7Sderaadt * software is freely granted, provided that this notice
12df930be7Sderaadt * is preserved.
13df930be7Sderaadt * ====================================================
14df930be7Sderaadt */
15df930be7Sderaadt
16df930be7Sderaadt #include "math.h"
17df930be7Sderaadt #include "math_private.h"
18df930be7Sderaadt
19df930be7Sderaadt static const float
20df930be7Sderaadt two25 = 3.3554432000e+07; /* 0x4c000000 */
21df930be7Sderaadt
22e7beb4a7Smillert float
frexpf(float x,int * eptr)23e7beb4a7Smillert frexpf(float x, int *eptr)
24df930be7Sderaadt {
25df930be7Sderaadt int32_t hx,ix;
26df930be7Sderaadt GET_FLOAT_WORD(hx,x);
27df930be7Sderaadt ix = 0x7fffffff&hx;
28df930be7Sderaadt *eptr = 0;
29df930be7Sderaadt if(ix>=0x7f800000||(ix==0)) return x; /* 0,inf,nan */
30df930be7Sderaadt if (ix<0x00800000) { /* subnormal */
31df930be7Sderaadt x *= two25;
32df930be7Sderaadt GET_FLOAT_WORD(hx,x);
33df930be7Sderaadt ix = hx&0x7fffffff;
34df930be7Sderaadt *eptr = -25;
35df930be7Sderaadt }
36df930be7Sderaadt *eptr += (ix>>23)-126;
37df930be7Sderaadt hx = (hx&0x807fffff)|0x3f000000;
38*9fc13282Smartynas SET_FLOAT_WORD(x,hx);
39df930be7Sderaadt return x;
40df930be7Sderaadt }
41