some fixes: fif did loose too many bits; unnormalized form did not work
authorceriel <none@none>
Mon, 31 Jul 1989 15:10:54 +0000 (15:10 +0000)
committerceriel <none@none>
Mon, 31 Jul 1989 15:10:54 +0000 (15:10 +0000)
mach/proto/fp/compact.c
mach/proto/fp/extend.c
mach/proto/fp/fif4.c
mach/proto/fp/fif8.c

index 34b8fd5..c19576b 100644 (file)
@@ -72,6 +72,10 @@ dbl_over:                    trap(EFOVFL);
                        DBL->_s.p2++;   /* rounding up  */
                        if (DBL->_s.p2 == 0L) { /* carry out    */
                            DBL->_s.p1.fract++;
+
+                           if (f->exp == 0 && (DBL->_s.p1.fract & ~DBL_MASK)) {
+                                       f->exp++;
+                               }
                            if (DBL->_s.p1.fract & DBL_CARRYOUT) { /* carry out */
                                if (DBL->_s.p1.fract & 01)
                                    DBL->_s.p2 = CARRYBIT;
@@ -148,6 +152,9 @@ sgl_over:                   trap(EFOVFL);
 #endif
                        if (f->m1 & SGL_ROUNDUP) {
                                SGL->fract++;
+                               if (f->exp == 0 && (f->m1 & ~SGL_MASK)) {
+                                       f->exp++;
+                               }
                        /* check normal */
                                if (SGL->fract & SGL_CARRYOUT)  {
                                        SGL->fract >>= 1;
index 84e1559..501c498 100644 (file)
@@ -62,6 +62,7 @@ zero:                 zrf_ext(to);
                to->exp >>= SGL_EXPSHIFT;
        if (to->exp > 0)
                leadbit++;      /* will set Lead bit later      */
+       else to->exp++;
 
        to->m1 = get4(cpt1);
 
index aa8a3d1..b379036 100644 (file)
@@ -42,8 +42,8 @@ struct fif4_returns *p;
                p->fpart = 0;
                return;
        }
-       b64_sft(&e1.m1, 64 - e1.exp);
-       b64_sft(&e1.m1, e1.exp - 64);   /* "loose" low order bits */
+       b64_sft(&e1.m1, 63 - e1.exp);
+       b64_sft(&e1.m1, e1.exp - 63);   /* "loose" low order bits */
        compact(&e1,(_double *) &(p->ipart), sizeof(SINGLE));
        p->fpart = sbf4(p->ipart, y);
 }
index 40ed775..728c7c3 100644 (file)
@@ -44,8 +44,8 @@ struct fif8_returns *p;
                p->fpart.__double[1] = 0;
                return;
        }
-       b64_sft(&e1.m1, 64 - e1.exp);
-       b64_sft(&e1.m1, e1.exp - 64);   /* "loose" low order bits */
+       b64_sft(&e1.m1, 63 - e1.exp);
+       b64_sft(&e1.m1, e1.exp - 63);   /* "loose" low order bits */
        compact(&e1, &(p->ipart), sizeof(DOUBLE));
        p->fpart = sbf8(p->ipart, y);
 }