1
0
mirror of https://github.com/golang/go synced 2024-11-21 14:54:40 -07:00

math: Fix off-by-one error in Ilogb and Logb.

Fixes #1141.

R=rsc
CC=adg, golang-dev
https://golang.org/cl/2194047
This commit is contained in:
Charles L. Dorian 2010-09-28 10:15:21 -04:00 committed by Russ Cox
parent 0e66a13d10
commit b233ac8f18
2 changed files with 13 additions and 12 deletions

View File

@ -383,16 +383,16 @@ var log = []float64{
2.161703872847352815363655e+00,
}
var logb = []float64{
3.0000000000000000e+00,
3.0000000000000000e+00,
-1.0000000000000000e+00,
3.0000000000000000e+00,
4.0000000000000000e+00,
2.0000000000000000e+00,
2.0000000000000000e+00,
-2.0000000000000000e+00,
2.0000000000000000e+00,
3.0000000000000000e+00,
1.0000000000000000e+00,
2.0000000000000000e+00,
1.0000000000000000e+00,
4.0000000000000000e+00,
0.0000000000000000e+00,
3.0000000000000000e+00,
}
var log10 = []float64{
6.9714316642508290997617083e-01,
@ -1806,8 +1806,9 @@ func TestHypot(t *testing.T) {
func TestIlogb(t *testing.T) {
for i := 0; i < len(vf); i++ {
if e := Ilogb(vf[i]); frexp[i].i != e {
t.Errorf("Ilogb(%g) = %d, want %d", vf[i], e, frexp[i].i)
a := frexp[i].i - 1 // adjust because fr in the interval [½, 1)
if e := Ilogb(vf[i]); a != e {
t.Errorf("Ilogb(%g) = %d, want %d", vf[i], e, a)
}
}
for i := 0; i < len(vflogbSC); i++ {

View File

@ -4,7 +4,7 @@
package math
// Logb(x) returns the binary logarithm of non-zero x.
// Logb(x) returns the binary exponent of non-zero x.
//
// Special cases are:
// Logb(±Inf) = +Inf
@ -22,10 +22,10 @@ func Logb(x float64) float64 {
case x != x: // IsNaN(x):
return x
}
return float64(int((Float64bits(x)>>shift)&mask) - bias)
return float64(int((Float64bits(x)>>shift)&mask) - (bias + 1))
}
// Ilogb(x) returns the binary logarithm of non-zero x as an integer.
// Ilogb(x) returns the binary exponent of non-zero x as an integer.
//
// Special cases are:
// Ilogb(±Inf) = MaxInt32
@ -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
return int((Float64bits(x)>>shift)&mask) - (bias + 1)
}