From 5f1a3be9dd1f6c0bda0993351effffaec0ce49ad Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Wed, 10 Dec 2008 14:17:24 -0800 Subject: [PATCH] bug120 R=r OCL=20921 CL=20921 --- src/cmd/gc/mparith3.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/cmd/gc/mparith3.c b/src/cmd/gc/mparith3.c index 7098ba68b2..8e3da7a4b3 100644 --- a/src/cmd/gc/mparith3.c +++ b/src/cmd/gc/mparith3.c @@ -161,7 +161,7 @@ double mpgetflt(Mpflt *a) { int s, i; - uvlong v; + uvlong v, vm; double f; if(a->val.ovf) @@ -186,22 +186,31 @@ mpgetflt(Mpflt *a) // independently or in the 6g half of the compiler // pick up the mantissa in a uvlong - s = 63; + s = 53; v = 0; for(i=Mpnorm-1; s>=Mpscale; i--) { v = (v<val.a[i]; s -= Mpscale; } + vm = v; + if(s > 0) + vm = (vm<val.a[i]>>(Mpscale-s)); + + // continue with 64 more bits + s += 64; + for(; s>=Mpscale; i--) { + v = (v<val.a[i]; + s -= Mpscale; + } if(s > 0) v = (v<val.a[i]>>(Mpscale-s)); - // 63 bits of mantissa being rounded to 53 - // should do this in multi precision - if((v&0x3ffULL) != 0x200ULL || (v&0x400) != 0) - v += 0x200ULL; // round toward even +//print("vm=%.16llux v=%.16llux\n", vm, v); + // round toward even + if(v != (1ULL<<63) || (vm&1ULL) != 0) + vm += v>>63; - v >>= 10; - f = (double)(v); + f = (double)(vm); f = ldexp(f, Mpnorm*Mpscale + a->exp - 53); if(a->val.neg) -- 2.48.1