1
0
mirror of https://github.com/golang/go synced 2024-11-20 10:54:49 -07:00

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
This commit is contained in:
Eoghan Sherry 2010-12-15 13:20:52 -05:00 committed by Russ Cox
parent eedf5c4529
commit 976e45726c
6 changed files with 11 additions and 11 deletions

View File

@ -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.

View File

@ -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

View File

@ -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
}

View File

@ -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
}

View File

@ -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

View File

@ -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)
}