diff --git a/src/pkg/math/bits.go b/src/pkg/math/bits.go index d36cd18d76b..1a97e76799a 100644 --- a/src/pkg/math/bits.go +++ b/src/pkg/math/bits.go @@ -10,7 +10,7 @@ const ( 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 28064f5f132..74c9c876aff 100644 --- a/src/pkg/math/exp_amd64.s +++ b/src/pkg/math/exp_amd64.s @@ -84,7 +84,7 @@ TEXT ·Exp(SB),7,$0 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 b63b508e600..203219c0dce 100644 --- a/src/pkg/math/frexp.go +++ b/src/pkg/math/frexp.go @@ -19,9 +19,9 @@ func Frexp(f float64) (frac float64, exp int) { 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 22ec06325d5..9e465151711 100644 --- a/src/pkg/math/logb.go +++ b/src/pkg/math/logb.go @@ -22,7 +22,7 @@ func Logb(x float64) float64 { 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 @@ func Ilogb(x float64) int { 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 ae0c7c88790..315174b7014 100644 --- a/src/pkg/math/modf.go +++ b/src/pkg/math/modf.go @@ -23,9 +23,9 @@ func Modf(f float64) (int float64, frac float64) { 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 8d821b559b6..6f35a383d11 100644 --- a/src/pkg/math/sqrt_port.go +++ b/src/pkg/math/sqrt_port.go @@ -113,7 +113,7 @@ func sqrtGo(x float64) float64 { } 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 @@ func sqrtGo(x float64) float64 { if ix != 0 { // remainder, result not exact q += q & 1 // round according to extra bit } - ix = q>>1 + uint64(exp+bias)<>1 + uint64(exp-1+bias)<