math: change float64 bias constant from 1022 to 1023

This makes some subtle code easier to understand.

R=rsc
CC=golang-dev
https://golang.org/cl/3444043
diff --git a/src/pkg/math/bits.go b/src/pkg/math/bits.go
index d36cd18..1a97e76 100644
--- a/src/pkg/math/bits.go
+++ b/src/pkg/math/bits.go
@@ -10,7 +10,7 @@
 	uvneginf = 0xFFF0000000000000
 	mask     = 0x7FF
 	shift    = 64 - 11 - 1
-	bias     = 1022
+	bias     = 1023
 )
 
 // Inf returns positive infinity if sign >= 0, negative infinity if sign < 0.
diff --git a/src/pkg/math/exp_amd64.s b/src/pkg/math/exp_amd64.s
index 28064f5..74c9c87 100644
--- a/src/pkg/math/exp_amd64.s
+++ b/src/pkg/math/exp_amd64.s
@@ -84,7 +84,7 @@
 	MULSD   X1, X0
 	ADDSD   $1.0, X0
 	// return fr * 2**exponent
-	MOVL    $0x3FF, AX // bias + 1
+	MOVL    $0x3FF, AX // bias
 	ADDL    AX, BX
 	JLE     underflow
 	CMPL    BX, $0x7FF
diff --git a/src/pkg/math/frexp.go b/src/pkg/math/frexp.go
index b63b508..203219c 100644
--- a/src/pkg/math/frexp.go
+++ b/src/pkg/math/frexp.go
@@ -19,9 +19,9 @@
 		return f, 0
 	}
 	x := Float64bits(f)
-	exp = int((x>>shift)&mask) - bias
+	exp = int((x>>shift)&mask) - bias + 1
 	x &^= mask << shift
-	x |= bias << shift
+	x |= (-1 + bias) << shift
 	frac = Float64frombits(x)
 	return
 }
diff --git a/src/pkg/math/logb.go b/src/pkg/math/logb.go
index 22ec063..9e46515 100644
--- a/src/pkg/math/logb.go
+++ b/src/pkg/math/logb.go
@@ -22,7 +22,7 @@
 	case x != x: // IsNaN(x):
 		return x
 	}
-	return float64(int((Float64bits(x)>>shift)&mask) - (bias + 1))
+	return float64(int((Float64bits(x)>>shift)&mask) - bias)
 }
 
 // Ilogb(x) returns the binary exponent of non-zero x as an integer.
@@ -43,5 +43,5 @@
 	case x < -MaxFloat64 || x > MaxFloat64: // IsInf(x, 0):
 		return MaxInt32
 	}
-	return int((Float64bits(x)>>shift)&mask) - (bias + 1)
+	return int((Float64bits(x)>>shift)&mask) - bias
 }
diff --git a/src/pkg/math/modf.go b/src/pkg/math/modf.go
index ae0c7c8..315174b 100644
--- a/src/pkg/math/modf.go
+++ b/src/pkg/math/modf.go
@@ -23,9 +23,9 @@
 	x := Float64bits(f)
 	e := uint(x>>shift)&mask - bias
 
-	// Keep the top 11+e bits, the integer part; clear the rest.
-	if e < 64-11 {
-		x &^= 1<<(64-11-e) - 1
+	// Keep the top 12+e bits, the integer part; clear the rest.
+	if e < 64-12 {
+		x &^= 1<<(64-12-e) - 1
 	}
 	int = Float64frombits(x)
 	frac = f - int
diff --git a/src/pkg/math/sqrt_port.go b/src/pkg/math/sqrt_port.go
index 8d821b5..6f35a38 100644
--- a/src/pkg/math/sqrt_port.go
+++ b/src/pkg/math/sqrt_port.go
@@ -113,7 +113,7 @@
 		}
 		exp++
 	}
-	exp -= bias + 1 // unbias exponent
+	exp -= bias // unbias exponent
 	ix &^= mask << shift
 	ix |= 1 << shift
 	if exp&1 == 1 { // odd exp, double x to make it even
@@ -138,6 +138,6 @@
 	if ix != 0 { // remainder, result not exact
 		q += q & 1 // round according to extra bit
 	}
-	ix = q>>1 + uint64(exp+bias)<<shift // significand + biased exponent
+	ix = q>>1 + uint64(exp-1+bias)<<shift // significand + biased exponent
 	return Float64frombits(ix)
 }