Commit bed6326a authored by Russ Cox's avatar Russ Cox

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/12230Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent 671bddf0
......@@ -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
}
......
......@@ -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)
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment