fixed rounding on ties to round to even, and fixed extend bug (test for 0
authorceriel <none@none>
Mon, 27 Nov 1989 16:26:02 +0000 (16:26 +0000)
committerceriel <none@none>
Mon, 27 Nov 1989 16:26:02 +0000 (16:26 +0000)
was wrong)

mach/proto/fp/compact.c
mach/proto/fp/extend.c

index 55c3c22..c2dea19 100644 (file)
@@ -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++;
index a7199e6..d2286aa 100644 (file)
@@ -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;
        }