From: ceriel Date: Mon, 31 Jul 1989 15:10:54 +0000 (+0000) Subject: some fixes: fif did loose too many bits; unnormalized form did not work X-Git-Tag: release-5-5~2305 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=37379d70bacbdc4ae7160f90e363666463684cd5;p=ack.git some fixes: fif did loose too many bits; unnormalized form did not work --- diff --git a/mach/proto/fp/compact.c b/mach/proto/fp/compact.c index 34b8fd579..c19576b92 100644 --- a/mach/proto/fp/compact.c +++ b/mach/proto/fp/compact.c @@ -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; diff --git a/mach/proto/fp/extend.c b/mach/proto/fp/extend.c index 84e1559fc..501c49811 100644 --- a/mach/proto/fp/extend.c +++ b/mach/proto/fp/extend.c @@ -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); diff --git a/mach/proto/fp/fif4.c b/mach/proto/fp/fif4.c index aa8a3d12f..b37903669 100644 --- a/mach/proto/fp/fif4.c +++ b/mach/proto/fp/fif4.c @@ -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); } diff --git a/mach/proto/fp/fif8.c b/mach/proto/fp/fif8.c index 40ed77534..728c7c3f4 100644 --- a/mach/proto/fp/fif8.c +++ b/mach/proto/fp/fif8.c @@ -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); }