From 04dcaf568552d2914047f0895ac6e1a05736d09e Mon Sep 17 00:00:00 2001 From: ceriel Date: Tue, 15 Aug 1989 09:04:49 +0000 Subject: [PATCH] did not handle -0.0 right --- mach/proto/fp/cmf4.c | 5 ++++- mach/proto/fp/cmf8.c | 6 +++++- mach/proto/fp/extend.c | 3 ++- mach/proto/fp/fef4.c | 9 +++++++-- mach/proto/fp/fef8.c | 9 +++++++-- 5 files changed, 25 insertions(+), 7 deletions(-) diff --git a/mach/proto/fp/cmf4.c b/mach/proto/fp/cmf4.c index 0611e332b..d427b62ea 100644 --- a/mach/proto/fp/cmf4.c +++ b/mach/proto/fp/cmf4.c @@ -30,8 +30,11 @@ _float f1,f2; sign1 = SIGN(l1); sign2 = SIGN(l2); - if (sign1 != sign2) + if (sign1 != sign2) { + if ((l1 & 0x7fffffff) == 0 && + (l2 & 0x7fffffff) == 0) return 0; return ((sign1 > 0) ? -1 : 1); + } return (sign1 * ((l1 < l2) ? 1 : -1)); } diff --git a/mach/proto/fp/cmf8.c b/mach/proto/fp/cmf8.c index 8fa51c53d..743ea5d46 100644 --- a/mach/proto/fp/cmf8.c +++ b/mach/proto/fp/cmf8.c @@ -28,7 +28,11 @@ _double d1,d2; sign1 = SIGN(l1); sign2 = SIGN(l2); if (sign1 != sign2) { - return ((sign1 > 0) ? -1 : 1); + l1 &= 0x7fffffff; + l2 &= 0x7fffffff; + if (l1 != 0 || l2 != 0) { + return ((sign1 > 0) ? -1 : 1); + } } if (l1 != l2) { /* we can decide here */ rv = l1 < l2 ? 1 : -1; diff --git a/mach/proto/fp/extend.c b/mach/proto/fp/extend.c index 501c49811..402b9eab7 100644 --- a/mach/proto/fp/extend.c +++ b/mach/proto/fp/extend.c @@ -42,7 +42,8 @@ int size; int leadbit = 0; cpt1 = (char *) from; - if (((DOUBLE *) cpt1)->_s.p1.fract == 0L) { + if (((DOUBLE *) cpt1)->_s.p1.fract == 0L || + ((DOUBLE *) cpt1)->_s.p1.fract == 0x80000000) { if (size == sizeof(SINGLE)) { zero: zrf_ext(to); return; diff --git a/mach/proto/fp/fef4.c b/mach/proto/fp/fef4.c index b781507b8..2c56d1534 100644 --- a/mach/proto/fp/fef4.c +++ b/mach/proto/fp/fef4.c @@ -26,7 +26,12 @@ struct fef4_returns *r; */ extend((_double *) &s1,&buf,sizeof(_float)); - p->e = buf.exp+1; - buf.exp = -1; + if (buf.exp == 0 && buf.m1 == 0 && buf.m2 == 0) { + p->e = 0; + } + else { + p->e = buf.exp+1; + buf.exp = -1; + } compact(&buf,(_double *) &p->f,sizeof(_float)); } diff --git a/mach/proto/fp/fef8.c b/mach/proto/fp/fef8.c index e261411ba..610d3df69 100644 --- a/mach/proto/fp/fef8.c +++ b/mach/proto/fp/fef8.c @@ -26,7 +26,12 @@ struct fef8_returns *r; */ extend(&s1,&buf,sizeof(_double)); - p->e = buf.exp + 1; - buf.exp = -1; + if (buf.exp == 0 && buf.m1 == 0 && buf.m2 == 0) { + p->e = 0; + } + else { + p->e = buf.exp + 1; + buf.exp = -1; + } compact(&buf,&p->f,sizeof(_double)); } -- 2.34.1