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