12116Sjkh/* s_frexpf.c -- float version of s_frexp.c.
22116Sjkh * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
32116Sjkh */
42116Sjkh
52116Sjkh/*
62116Sjkh * ====================================================
72116Sjkh * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
82116Sjkh *
92116Sjkh * Developed at SunPro, a Sun Microsystems, Inc. business.
102116Sjkh * Permission to use, copy, modify, and distribute this
118870Srgrimes * software is freely granted, provided that this notice
122116Sjkh * is preserved.
132116Sjkh * ====================================================
142116Sjkh */
152116Sjkh
16176451Sdas#include <sys/cdefs.h>
17176451Sdas__FBSDID("$FreeBSD$");
182116Sjkh
192116Sjkh#include "math.h"
202116Sjkh#include "math_private.h"
212116Sjkh
222116Sjkhstatic const float
232116Sjkhtwo25 =  3.3554432000e+07; /* 0x4c000000 */
242116Sjkh
2597413Salfredfloat
2697413Salfredfrexpf(float x, int *eptr)
272116Sjkh{
282116Sjkh	int32_t hx,ix;
292116Sjkh	GET_FLOAT_WORD(hx,x);
302116Sjkh	ix = 0x7fffffff&hx;
312116Sjkh	*eptr = 0;
322116Sjkh	if(ix>=0x7f800000||(ix==0)) return x;	/* 0,inf,nan */
332116Sjkh	if (ix<0x00800000) {		/* subnormal */
342116Sjkh	    x *= two25;
352116Sjkh	    GET_FLOAT_WORD(hx,x);
362116Sjkh	    ix = hx&0x7fffffff;
372116Sjkh	    *eptr = -25;
382116Sjkh	}
392116Sjkh	*eptr += (ix>>23)-126;
402116Sjkh	hx = (hx&0x807fffff)|0x3f000000;
41170550Sbde	SET_FLOAT_WORD(x,hx);
422116Sjkh	return x;
432116Sjkh}
44