1*1e651e1eSRoland Levillain 2*1e651e1eSRoland Levillain /* @(#)s_frexp.c 1.4 95/01/18 */ 3*1e651e1eSRoland Levillain /* 4*1e651e1eSRoland Levillain * ==================================================== 5*1e651e1eSRoland Levillain * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 6*1e651e1eSRoland Levillain * 7*1e651e1eSRoland Levillain * Developed at SunSoft, a Sun Microsystems, Inc. business. 8*1e651e1eSRoland Levillain * Permission to use, copy, modify, and distribute this 9*1e651e1eSRoland Levillain * software is freely granted, provided that this notice 10*1e651e1eSRoland Levillain * is preserved. 11*1e651e1eSRoland Levillain * ==================================================== 12*1e651e1eSRoland Levillain */ 13*1e651e1eSRoland Levillain 14*1e651e1eSRoland Levillain /* 15*1e651e1eSRoland Levillain * for non-zero x 16*1e651e1eSRoland Levillain * x = ieee_frexp(arg,&exp); 17*1e651e1eSRoland Levillain * return a double fp quantity x such that 0.5 <= |x| <1.0 18*1e651e1eSRoland Levillain * and the corresponding binary exponent "exp". That is 19*1e651e1eSRoland Levillain * arg = x*2^exp. 20*1e651e1eSRoland Levillain * If arg is inf, 0.0, or NaN, then ieee_frexp(arg,&exp) returns arg 21*1e651e1eSRoland Levillain * with *exp=0. 22*1e651e1eSRoland Levillain */ 23*1e651e1eSRoland Levillain 24*1e651e1eSRoland Levillain #include "fdlibm.h" 25*1e651e1eSRoland Levillain 26*1e651e1eSRoland Levillain #ifdef __STDC__ 27*1e651e1eSRoland Levillain static const double 28*1e651e1eSRoland Levillain #else 29*1e651e1eSRoland Levillain static double 30*1e651e1eSRoland Levillain #endif 31*1e651e1eSRoland Levillain two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */ 32*1e651e1eSRoland Levillain 33*1e651e1eSRoland Levillain #ifdef __STDC__ ieee_frexp(double x,int * eptr)34*1e651e1eSRoland Levillain double ieee_frexp(double x, int *eptr) 35*1e651e1eSRoland Levillain #else 36*1e651e1eSRoland Levillain double ieee_frexp(x, eptr) 37*1e651e1eSRoland Levillain double x; int *eptr; 38*1e651e1eSRoland Levillain #endif 39*1e651e1eSRoland Levillain { 40*1e651e1eSRoland Levillain int hx, ix, lx; 41*1e651e1eSRoland Levillain hx = __HI(x); 42*1e651e1eSRoland Levillain ix = 0x7fffffff&hx; 43*1e651e1eSRoland Levillain lx = __LO(x); 44*1e651e1eSRoland Levillain *eptr = 0; 45*1e651e1eSRoland Levillain if(ix>=0x7ff00000||((ix|lx)==0)) return x; /* 0,inf,nan */ 46*1e651e1eSRoland Levillain if (ix<0x00100000) { /* subnormal */ 47*1e651e1eSRoland Levillain x *= two54; 48*1e651e1eSRoland Levillain hx = __HI(x); 49*1e651e1eSRoland Levillain ix = hx&0x7fffffff; 50*1e651e1eSRoland Levillain *eptr = -54; 51*1e651e1eSRoland Levillain } 52*1e651e1eSRoland Levillain *eptr += (ix>>20)-1022; 53*1e651e1eSRoland Levillain hx = (hx&0x800fffff)|0x3fe00000; 54*1e651e1eSRoland Levillain __HI(x) = hx; 55*1e651e1eSRoland Levillain return x; 56*1e651e1eSRoland Levillain } 57