mirror of
https://github.com/golang/go
synced 2024-11-24 06:40:17 -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:
parent
eedf5c4529
commit
976e45726c
@ -10,7 +10,7 @@ const (
|
|||||||
uvneginf = 0xFFF0000000000000
|
uvneginf = 0xFFF0000000000000
|
||||||
mask = 0x7FF
|
mask = 0x7FF
|
||||||
shift = 64 - 11 - 1
|
shift = 64 - 11 - 1
|
||||||
bias = 1022
|
bias = 1023
|
||||||
)
|
)
|
||||||
|
|
||||||
// Inf returns positive infinity if sign >= 0, negative infinity if sign < 0.
|
// Inf returns positive infinity if sign >= 0, negative infinity if sign < 0.
|
||||||
|
@ -84,7 +84,7 @@ TEXT ·Exp(SB),7,$0
|
|||||||
MULSD X1, X0
|
MULSD X1, X0
|
||||||
ADDSD $1.0, X0
|
ADDSD $1.0, X0
|
||||||
// return fr * 2**exponent
|
// return fr * 2**exponent
|
||||||
MOVL $0x3FF, AX // bias + 1
|
MOVL $0x3FF, AX // bias
|
||||||
ADDL AX, BX
|
ADDL AX, BX
|
||||||
JLE underflow
|
JLE underflow
|
||||||
CMPL BX, $0x7FF
|
CMPL BX, $0x7FF
|
||||||
|
@ -19,9 +19,9 @@ func Frexp(f float64) (frac float64, exp int) {
|
|||||||
return f, 0
|
return f, 0
|
||||||
}
|
}
|
||||||
x := Float64bits(f)
|
x := Float64bits(f)
|
||||||
exp = int((x>>shift)&mask) - bias
|
exp = int((x>>shift)&mask) - bias + 1
|
||||||
x &^= mask << shift
|
x &^= mask << shift
|
||||||
x |= bias << shift
|
x |= (-1 + bias) << shift
|
||||||
frac = Float64frombits(x)
|
frac = Float64frombits(x)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ func Logb(x float64) float64 {
|
|||||||
case x != x: // IsNaN(x):
|
case x != x: // IsNaN(x):
|
||||||
return 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.
|
// 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):
|
case x < -MaxFloat64 || x > MaxFloat64: // IsInf(x, 0):
|
||||||
return MaxInt32
|
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)
|
x := Float64bits(f)
|
||||||
e := uint(x>>shift)&mask - bias
|
e := uint(x>>shift)&mask - bias
|
||||||
|
|
||||||
// Keep the top 11+e bits, the integer part; clear the rest.
|
// Keep the top 12+e bits, the integer part; clear the rest.
|
||||||
if e < 64-11 {
|
if e < 64-12 {
|
||||||
x &^= 1<<(64-11-e) - 1
|
x &^= 1<<(64-12-e) - 1
|
||||||
}
|
}
|
||||||
int = Float64frombits(x)
|
int = Float64frombits(x)
|
||||||
frac = f - int
|
frac = f - int
|
||||||
|
@ -113,7 +113,7 @@ func sqrtGo(x float64) float64 {
|
|||||||
}
|
}
|
||||||
exp++
|
exp++
|
||||||
}
|
}
|
||||||
exp -= bias + 1 // unbias exponent
|
exp -= bias // unbias exponent
|
||||||
ix &^= mask << shift
|
ix &^= mask << shift
|
||||||
ix |= 1 << shift
|
ix |= 1 << shift
|
||||||
if exp&1 == 1 { // odd exp, double x to make it even
|
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
|
if ix != 0 { // remainder, result not exact
|
||||||
q += q & 1 // round according to extra bit
|
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)
|
return Float64frombits(ix)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user