aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2015-07-14 22:42:16 -0400
committerRuss Cox <rsc@golang.org>2015-07-15 05:35:22 +0000
commitbed6326a3c04811f394490b537c07c863b3df6de (patch)
treeb53cdb3dd47ec17c1376ad0f8cde889d4838982c
parent671bddf0b0a1146279dd5c921a1a34e25d16a1ae (diff)
downloadgo-bed6326a3c04811f394490b537c07c863b3df6de.tar.gz
go-bed6326a3c04811f394490b537c07c863b3df6de.zip
math: fix Log2 test failures on ppc64 (and s390)
- Make Log2 exact for powers of two. - Fix error tolerance function to make tolerance a function of the correct (expected) value. Fixes #9066. Change-Id: I0320a93ce4130deed1c7b7685627d51acb7bc56d Reviewed-on: https://go-review.googlesource.com/12230 Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--src/math/all_test.go6
-rw-r--r--src/math/log10.go5
2 files changed, 9 insertions, 2 deletions
diff --git a/src/math/all_test.go b/src/math/all_test.go
index 0037b4a64c..e18e45e020 100644
--- a/src/math/all_test.go
+++ b/src/math/all_test.go
@@ -1730,8 +1730,10 @@ func tolerance(a, b, e float64) bool {
d = -d
}
- if a != 0 {
- e = e * a
+ // note: b is correct (expected) value, a is actual value.
+ // make error tolerance a fraction of b, not a.
+ if b != 0 {
+ e = e * b
if e < 0 {
e = -e
}
diff --git a/src/math/log10.go b/src/math/log10.go
index 95cfbf47ce..ccd079d891 100644
--- a/src/math/log10.go
+++ b/src/math/log10.go
@@ -18,5 +18,10 @@ func Log2(x float64) float64
func log2(x float64) float64 {
frac, exp := Frexp(x)
+ // Make sure exact powers of two give an exact answer.
+ // Don't depend on Log(0.5)*(1/Ln2)+exp being exactly exp-1.
+ if frac == 0.5 {
+ return float64(exp - 1)
+ }
return Log(frac)*(1/Ln2) + float64(exp)
}