1*16946Sralph /* @(#)frexp.c 4.2 (Berkeley) 08/16/84 */ 21966Swnj /* 31966Swnj the call 41966Swnj x = frexp(arg,&exp); 51966Swnj must return a double fp quantity x which is <1.0 61966Swnj and the corresponding binary exponent "exp". 71966Swnj such that 81966Swnj arg = x*2^exp 9*16946Sralph if the argument is 0.0, return 0.0 mantissa and 0 exponent. 101966Swnj */ 111966Swnj 121966Swnj double 131966Swnj frexp(x,i) 141966Swnj double x; 151966Swnj int *i; 161966Swnj { 171966Swnj int neg; 181966Swnj int j; 191966Swnj j = 0; 201966Swnj neg = 0; 211966Swnj if(x<0){ 221966Swnj x = -x; 231966Swnj neg = 1; 241966Swnj } 25*16946Sralph if(x>=1.0) 26*16946Sralph while(x>=1.0){ 271966Swnj j = j+1; 281966Swnj x = x/2; 291966Swnj } 30*16946Sralph else if(x<0.5 && x != 0.0) 311966Swnj while(x<0.5){ 321966Swnj j = j-1; 331966Swnj x = 2*x; 341966Swnj } 351966Swnj *i = j; 361966Swnj if(neg) x = -x; 371966Swnj return(x); 381966Swnj } 39