1
0
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:
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 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.

View File

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

View File

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

View File

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

View File

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

View File

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