126551Sdonn #if defined(LIBC_SCCS) && !defined(lint) 2*46597Sdonn static char sccsid[] = "@(#)frexp.c 5.3 (Berkeley) 02/23/91"; 326551Sdonn #endif LIBC_SCCS and not lint 422088Smckusick 5*46597Sdonn #include <math.h> 6*46597Sdonn 71966Swnj /* 822088Smckusick * the call 922088Smckusick * x = frexp(arg,&exp); 1022088Smckusick * must return a double fp quantity x which is <1.0 1122088Smckusick * and the corresponding binary exponent "exp". 1222088Smckusick * such that 1322088Smckusick * arg = x*2^exp 1422088Smckusick * if the argument is 0.0, return 0.0 mantissa and 0 exponent. 1522088Smckusick */ 161966Swnj 171966Swnj double frexp(x,i)181966Swnjfrexp(x,i) 191966Swnj double x; 201966Swnj int *i; 211966Swnj { 221966Swnj int neg; 231966Swnj int j; 241966Swnj j = 0; 251966Swnj neg = 0; 261966Swnj if(x<0){ 271966Swnj x = -x; 281966Swnj neg = 1; 291966Swnj } 3016946Sralph if(x>=1.0) 3116946Sralph while(x>=1.0){ 321966Swnj j = j+1; 331966Swnj x = x/2; 341966Swnj } 3516946Sralph else if(x<0.5 && x != 0.0) 361966Swnj while(x<0.5){ 371966Swnj j = j-1; 381966Swnj x = 2*x; 391966Swnj } 401966Swnj *i = j; 411966Swnj if(neg) x = -x; 421966Swnj return(x); 431966Swnj } 44