1*22088Smckusick #ifndef lint 2*22088Smckusick static char sccsid[] = "@(#)frexp.c 5.1 (Berkeley) 06/05/85"; 3*22088Smckusick #endif not lint 4*22088Smckusick 51966Swnj /* 6*22088Smckusick * the call 7*22088Smckusick * x = frexp(arg,&exp); 8*22088Smckusick * must return a double fp quantity x which is <1.0 9*22088Smckusick * and the corresponding binary exponent "exp". 10*22088Smckusick * such that 11*22088Smckusick * arg = x*2^exp 12*22088Smckusick * if the argument is 0.0, return 0.0 mantissa and 0 exponent. 13*22088Smckusick */ 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