From f6b93ab432dd43d030ecfc7240e8282a7d7e409a Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Mon, 19 Jul 2010 16:10:46 -0700 Subject: [PATCH] change floating literal normalization from word-oriented to bit-oriented. this will increase fp literal precision by up to a full word. R=rsc CC=golang-dev https://golang.org/cl/1859044 --- src/cmd/gc/mparith3.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/cmd/gc/mparith3.c b/src/cmd/gc/mparith3.c index 5ee8b0308f..7b7e66668e 100644 --- a/src/cmd/gc/mparith3.c +++ b/src/cmd/gc/mparith3.c @@ -27,16 +27,36 @@ sigfig(Mpflt *a) void mpnorm(Mpflt *a) { - int s; + int s, os; + long x; - s = sigfig(a); - if(s == 0) { + os = sigfig(a); + if(os == 0) { // zero a->exp = 0; a->val.neg = 0; return; } - s = (Mpnorm-s) * Mpscale; + + // this will normalize to the nearest word + x = a->val.a[os-1]; + s = (Mpnorm-os) * Mpscale; + + // further normalize to the nearest bit + for(;;) { + x <<= 1; + if(x & Mpbase) + break; + s++; + if(x == 0) { + // this error comes from trying to + // convert an Inf or something + // where the initial x=0x80000000 + s = (Mpnorm-os) * Mpscale; + break; + } + } + mpshiftfix(&a->val, s); a->exp -= s; }