]> Cypherpunks repositories - gostls13.git/commitdiff
math: Fix off-by-one error in Ilogb and Logb.
authorCharles L. Dorian <cldorian@gmail.com>
Tue, 28 Sep 2010 14:15:21 +0000 (10:15 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 28 Sep 2010 14:15:21 +0000 (10:15 -0400)
Fixes #1141.

R=rsc
CC=adg, golang-dev
https://golang.org/cl/2194047

src/pkg/math/all_test.go
src/pkg/math/logb.go

index 485f6e54c88b0534bdbc1310298e635c6519312e..8a60bca01dfdac2609a3dfd0fe5b15ee6d67faa5 100644 (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++ {
index acda15d226e0e9dcdad4699d06e23b942369353d..22ec06325d596afc2e962b61b95e0506c2d72f4b 100644 (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)
 }