Commit 976e4572 authored by Eoghan Sherry's avatar Eoghan Sherry Committed by Russ Cox

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
parent eedf5c45
......@@ -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.
......
......@@ -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
......
......@@ -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
}
......@@ -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
}
......@@ -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
......
......@@ -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)<<shift // significand + biased exponent
ix = q>>1 + uint64(exp-1+bias)<<shift // significand + biased exponent
return Float64frombits(ix)
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment