some fixes: fif did loose too many bits; unnormalized form did not work

This commit is contained in:
ceriel 1989-07-31 15:10:54 +00:00
parent 338fb5fb30
commit 37379d70ba
4 changed files with 12 additions and 4 deletions

View file

@ -72,6 +72,10 @@ dbl_over: trap(EFOVFL);
DBL->_s.p2++; /* rounding up */ DBL->_s.p2++; /* rounding up */
if (DBL->_s.p2 == 0L) { /* carry out */ if (DBL->_s.p2 == 0L) { /* carry out */
DBL->_s.p1.fract++; 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 & DBL_CARRYOUT) { /* carry out */
if (DBL->_s.p1.fract & 01) if (DBL->_s.p1.fract & 01)
DBL->_s.p2 = CARRYBIT; DBL->_s.p2 = CARRYBIT;
@ -148,6 +152,9 @@ sgl_over: trap(EFOVFL);
#endif #endif
if (f->m1 & SGL_ROUNDUP) { if (f->m1 & SGL_ROUNDUP) {
SGL->fract++; SGL->fract++;
if (f->exp == 0 && (f->m1 & ~SGL_MASK)) {
f->exp++;
}
/* check normal */ /* check normal */
if (SGL->fract & SGL_CARRYOUT) { if (SGL->fract & SGL_CARRYOUT) {
SGL->fract >>= 1; SGL->fract >>= 1;

View file

@ -62,6 +62,7 @@ zero: zrf_ext(to);
to->exp >>= SGL_EXPSHIFT; to->exp >>= SGL_EXPSHIFT;
if (to->exp > 0) if (to->exp > 0)
leadbit++; /* will set Lead bit later */ leadbit++; /* will set Lead bit later */
else to->exp++;
to->m1 = get4(cpt1); to->m1 = get4(cpt1);

View file

@ -42,8 +42,8 @@ struct fif4_returns *p;
p->fpart = 0; p->fpart = 0;
return; return;
} }
b64_sft(&e1.m1, 64 - e1.exp); b64_sft(&e1.m1, 63 - e1.exp);
b64_sft(&e1.m1, e1.exp - 64); /* "loose" low order bits */ b64_sft(&e1.m1, e1.exp - 63); /* "loose" low order bits */
compact(&e1,(_double *) &(p->ipart), sizeof(SINGLE)); compact(&e1,(_double *) &(p->ipart), sizeof(SINGLE));
p->fpart = sbf4(p->ipart, y); p->fpart = sbf4(p->ipart, y);
} }

View file

@ -44,8 +44,8 @@ struct fif8_returns *p;
p->fpart.__double[1] = 0; p->fpart.__double[1] = 0;
return; return;
} }
b64_sft(&e1.m1, 64 - e1.exp); b64_sft(&e1.m1, 63 - e1.exp);
b64_sft(&e1.m1, e1.exp - 64); /* "loose" low order bits */ b64_sft(&e1.m1, e1.exp - 63); /* "loose" low order bits */
compact(&e1, &(p->ipart), sizeof(DOUBLE)); compact(&e1, &(p->ipart), sizeof(DOUBLE));
p->fpart = sbf8(p->ipart, y); p->fpart = sbf8(p->ipart, y);
} }