mirror of
https://github.com/golang/go
synced 2024-11-22 05:44:41 -07:00
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
This commit is contained in:
parent
a5fe54aa2b
commit
f6b93ab432
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user