Work on file usr/src/libc/gen/frexp.c
Work on file usr/src/libc/gen/ldexp.c
Work on file usr/src/libc/gen/modf.c
Co-Authored-By: John Reiser <jfr@research.uucp>
Synthesized-from: 32v
--- /dev/null
+/*
+ the call
+ x = frexp(arg,&exp);
+ must return a double fp quantity x which is <1.0
+ and the corresponding binary exponent "exp".
+ such that
+ arg = x*2^exp
+*/
+
+double
+frexp(x,i)
+double x;
+int *i;
+{
+ int neg;
+ int j;
+ j = 0;
+ neg = 0;
+ if(x<0){
+ x = -x;
+ neg = 1;
+ }
+ if(x>1.0)
+ while(x>1){
+ j = j+1;
+ x = x/2;
+ }
+ else if(x<0.5)
+ while(x<0.5){
+ j = j-1;
+ x = 2*x;
+ }
+ *i = j;
+ if(neg) x = -x;
+ return(x);
+ }
--- /dev/null
+double
+ldexp(fr,exp) double fr; int exp;{
+double huge = 1.701411834604692293e38;
+ int neg;
+ int i;
+ double frexp();
+
+ neg = 0;
+ if(fr<0){
+ fr = -fr;
+ neg = 1;
+ }
+ fr = frexp(fr,&i);
+ while(fr<.5){
+ fr = 2*fr;
+ i = i-1;
+ }
+ exp = exp+i;
+ if(exp>127)
+ if(neg)
+ return(-huge);
+ else
+ return(huge);
+ if(exp<-127)
+ return(0);
+ while(exp>30){
+ fr = fr*(1L<<30);
+ exp = exp-30;
+ }
+ while(exp<-30){
+ fr = fr/(1L<<30);
+ exp = exp+30;
+ }
+ if(exp>0)
+ fr = fr*(1L<<exp);
+ if(exp<0)
+ fr = fr/(1L<<-exp);
+ if(neg) fr = -fr;
+ return(fr);
+ }
--- /dev/null
+double
+modf(arg,ent)
+double arg;
+double *ent;
+{
+ int neg;
+ int i;
+ double two30 = 1073741824.;
+ double big = 72057594037927936.; /*2^56*/
+ double x, temp;
+ double ldexp();
+ double frexp();
+ long l;
+
+ neg = 1;
+ if(arg<0){
+ neg = -1;
+ arg = -arg;
+ }
+ if(arg>big){
+ *ent = neg*arg;
+ return(0);
+ }
+ if(arg<1){
+ *ent = 0;
+ return(neg*arg);
+ }
+
+ temp = 0;
+ while(arg>two30){
+ x = frexp(arg,&i);
+ if(arg<0.5){
+ arg = 2*arg;
+ i = i-1;
+ }
+ x = ldexp(0.5,i);
+ arg = arg - x;
+ temp = temp + x;
+ }
+
+ l = arg;
+ arg = arg-l;
+ temp = temp+l;
+ *ent = neg*temp;
+ return(neg*arg);
+ }