From b91af798bca6bd963185151799a347e7efbb68e9 Mon Sep 17 00:00:00 2001 From: ceriel Date: Mon, 27 Nov 1989 16:26:02 +0000 Subject: [PATCH] fixed rounding on ties to round to even, and fixed extend bug (test for 0 was wrong) --- mach/proto/fp/compact.c | 10 ++++++++-- mach/proto/fp/extend.c | 24 ++++++++++++++---------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/mach/proto/fp/compact.c b/mach/proto/fp/compact.c index 55c3c22eb..c2dea192d 100644 --- a/mach/proto/fp/compact.c +++ b/mach/proto/fp/compact.c @@ -63,12 +63,15 @@ dbl_over: trap(EFOVFL); DBL->_s.p2 |= (f->m1 << DBL_LUNPACK); /* plus 10 == 32 */ /* if not exact then round to nearest */ + /* on a tie, round to even */ #ifdef EXCEPTION_INEXACT if ((f->m2 & DBL_EXACT) != 0) { INEXACT(); #endif - if (f->m2 & DBL_ROUNDUP) { + if (((f->m2 & DBL_EXACT) > DBL_ROUNDUP) + || ((f->m2 & DBL_EXACT) == DBL_ROUNDUP + && (f->m2 & (DBL_ROUNDUP << 1)))) { DBL->_s.p2++; /* rounding up */ if (DBL->_s.p2 == 0L) { /* carry out */ DBL->_s.p1.fract++; @@ -153,12 +156,15 @@ sgl_over: trap(EFOVFL); SGL->fract = (f->m1 >> SGL_RUNPACK); /* check for rounding to nearest */ + /* on a tie, round to even */ #ifdef EXCEPTION_INEXACT if (f->m2 != 0 || (f->m1 & SGL_EXACT) != 0L) { INEXACT(); #endif - if (f->m1 & SGL_ROUNDUP) { + if (((f->m1 & SGL_EXACT) > SGL_ROUNDUP) + || ((f->m1 & SGL_EXACT) == SGL_ROUNDUP + && (f->m1 & (SGL_ROUNDUP << 1)))) { SGL->fract++; if (f->exp == 0 && (f->m1 & ~SGL_MASK)) { f->exp++; diff --git a/mach/proto/fp/extend.c b/mach/proto/fp/extend.c index a7199e6ae..d2286aa8a 100644 --- a/mach/proto/fp/extend.c +++ b/mach/proto/fp/extend.c @@ -42,16 +42,6 @@ int size; int leadbit = 0; cpt1 = (char *) from; - if (((DOUBLE *) cpt1)->_s.p1.fract == 0L || - ((DOUBLE *) cpt1)->_s.p1.fract == 0x80000000) { - if (size == sizeof(SINGLE)) { -zero: zrf_ext(to); - return; - } - else if (((DOUBLE *) cpt1)->_s.p2 == 0L) - goto zero; - } -/* there is a number to convert so lets get started */ #if FL_MSL_AT_LOW_ADDRESS #if FL_MSW_AT_LOW_ADDRESS @@ -86,6 +76,13 @@ zero: zrf_ext(to); cpt1 += 4; to->m1 = get4(cpt1); #endif + if (to->exp == 1 && to->m1 == 0 && tmp == 0) { + to->exp = 0; + to->sign = 0; + to->m1 = 0; + to->m2 = 0; + return; + } to->m1 <<= DBL_M1LEFT; /* shift */ to->exp -= DBL_BIAS; /* remove bias */ to->m1 |= (tmp>>DBL_RPACK); /* plus 10 == 32 */ @@ -94,6 +91,13 @@ zero: zrf_ext(to); else { /* size == sizeof(SINGLE) */ to->m1 = get4(cpt1); to->m1 <<= SGL_M1LEFT; /* shift */ + if (to->exp == 1 && to->m1 == 0) { + to->exp = 0; + to->sign = 0; + to->m1 = 0; + to->m2 = 0; + return; + } to->exp -= SGL_BIAS; /* remove bias */ to->m2 = 0L; } -- 2.34.1