diff options
author | Russ Cox <rsc@golang.org> | 2015-07-14 22:42:16 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2015-07-15 05:35:22 +0000 |
commit | bed6326a3c04811f394490b537c07c863b3df6de (patch) | |
tree | b53cdb3dd47ec17c1376ad0f8cde889d4838982c | |
parent | 671bddf0b0a1146279dd5c921a1a34e25d16a1ae (diff) | |
download | go-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.go | 6 | ||||
-rw-r--r-- | src/math/log10.go | 5 |
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) } |