Bell 32V development
authorTom London <tbl@research.uucp>
Mon, 22 Jan 1979 05:24:10 +0000 (00:24 -0500)
committerTom London <tbl@research.uucp>
Mon, 22 Jan 1979 05:24:10 +0000 (00:24 -0500)
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

usr/src/libc/gen/frexp.c [new file with mode: 0644]
usr/src/libc/gen/ldexp.c [new file with mode: 0644]
usr/src/libc/gen/modf.c [new file with mode: 0644]

diff --git a/usr/src/libc/gen/frexp.c b/usr/src/libc/gen/frexp.c
new file mode 100644 (file)
index 0000000..8d9425a
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+       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);
+       }
diff --git a/usr/src/libc/gen/ldexp.c b/usr/src/libc/gen/ldexp.c
new file mode 100644 (file)
index 0000000..e306ca9
--- /dev/null
@@ -0,0 +1,40 @@
+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);
+       }
diff --git a/usr/src/libc/gen/modf.c b/usr/src/libc/gen/modf.c
new file mode 100644 (file)
index 0000000..32acfa5
--- /dev/null
@@ -0,0 +1,46 @@
+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);
+       }