From 988493a4aebcb0147e024f00110b6979a1d67659 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 0611e332..d427b62e 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 8fa51c53..743ea5d4 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 501c4981..402b9eab 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 b781507b..2c56d153 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 e261411b..610d3df6 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)); }