1*26551Sdonn #if defined(LIBC_SCCS) && !defined(lint) 2*26551Sdonn static char sccsid[] = "@(#)frexp.c 5.2 (Berkeley) 03/09/86"; 3*26551Sdonn #endif LIBC_SCCS and not lint 422088Smckusick 51966Swnj /* 622088Smckusick * the call 722088Smckusick * x = frexp(arg,&exp); 822088Smckusick * must return a double fp quantity x which is <1.0 922088Smckusick * and the corresponding binary exponent "exp". 1022088Smckusick * such that 1122088Smckusick * arg = x*2^exp 1222088Smckusick * if the argument is 0.0, return 0.0 mantissa and 0 exponent. 1322088Smckusick */ 141966Swnj 151966Swnj double 161966Swnj frexp(x,i) 171966Swnj double x; 181966Swnj int *i; 191966Swnj { 201966Swnj int neg; 211966Swnj int j; 221966Swnj j = 0; 231966Swnj neg = 0; 241966Swnj if(x<0){ 251966Swnj x = -x; 261966Swnj neg = 1; 271966Swnj } 2816946Sralph if(x>=1.0) 2916946Sralph while(x>=1.0){ 301966Swnj j = j+1; 311966Swnj x = x/2; 321966Swnj } 3316946Sralph else if(x<0.5 && x != 0.0) 341966Swnj while(x<0.5){ 351966Swnj j = j-1; 361966Swnj x = 2*x; 371966Swnj } 381966Swnj *i = j; 391966Swnj if(neg) x = -x; 401966Swnj return(x); 411966Swnj } 42