mirror of
https://github.com/golang/go
synced 2024-11-25 10:17:57 -07:00
math: delete non-Sqrt-based Hypot
I was confused by the existence of two portable Hypot routines in the tree when I cleaned things up, and I made ARM use the wrong (imprecise) one. Use the right one, and delete the wrong one. Fixes arm build. R=golang-dev, r CC=golang-dev https://golang.org/cl/5485065
This commit is contained in:
parent
2c6d3eaf78
commit
2572803899
@ -2062,30 +2062,16 @@ func TestHypot(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHypotSqrtGo(t *testing.T) {
|
func TestHypotGo(t *testing.T) {
|
||||||
for i := 0; i < len(vf); i++ {
|
for i := 0; i < len(vf); i++ {
|
||||||
a := Abs(1e200 * tanh[i] * Sqrt(2))
|
a := Abs(1e200 * tanh[i] * Sqrt(2))
|
||||||
if f := HypotSqrtGo(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) {
|
if f := HypotGo(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) {
|
||||||
t.Errorf("HypotSqrtGo(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a)
|
t.Errorf("HypotGo(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for i := 0; i < len(vfhypotSC); i++ {
|
for i := 0; i < len(vfhypotSC); i++ {
|
||||||
if f := HypotSqrtGo(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) {
|
if f := HypotGo(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) {
|
||||||
t.Errorf("HypotSqrtGo(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i])
|
t.Errorf("HypotGo(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i])
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHypotNoSqrtGo(t *testing.T) {
|
|
||||||
for i := 0; i < len(vf); i++ {
|
|
||||||
a := Abs(1e200 * tanh[i] * Sqrt(2))
|
|
||||||
if f := HypotNoSqrtGo(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) {
|
|
||||||
t.Errorf("HypotNoSqrtGo(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for i := 0; i < len(vfhypotSC); i++ {
|
|
||||||
if f := HypotNoSqrtGo(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) {
|
|
||||||
t.Errorf("HypotNoSqrtGo(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i])
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2741,15 +2727,9 @@ func BenchmarkHypot(b *testing.B) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkHypotNoSqrtGo(b *testing.B) {
|
func BenchmarkHypotGo(b *testing.B) {
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
HypotNoSqrtGo(3, 4)
|
HypotGo(3, 4)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkHypotSqrtGo(b *testing.B) {
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
HypotSqrtGo(3, 4)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,6 +7,5 @@ package math
|
|||||||
// Export internal functions for testing.
|
// Export internal functions for testing.
|
||||||
var ExpGo = exp
|
var ExpGo = exp
|
||||||
var Exp2Go = exp2
|
var Exp2Go = exp2
|
||||||
var HypotSqrtGo = hypotSqrt
|
var HypotGo = hypot
|
||||||
var HypotNoSqrtGo = hypotNoSqrt
|
|
||||||
var SqrtGo = sqrt
|
var SqrtGo = sqrt
|
||||||
|
@ -16,7 +16,7 @@ package math
|
|||||||
// Hypot(p, q) = NaN if p or q is NaN
|
// Hypot(p, q) = NaN if p or q is NaN
|
||||||
func Hypot(p, q float64) float64
|
func Hypot(p, q float64) float64
|
||||||
|
|
||||||
func hypotSqrt(p, q float64) float64 {
|
func hypot(p, q float64) float64 {
|
||||||
// TODO(rsc): Remove manual inlining of IsNaN, IsInf
|
// TODO(rsc): Remove manual inlining of IsNaN, IsInf
|
||||||
// when compiler does it for us
|
// when compiler does it for us
|
||||||
// special cases
|
// special cases
|
||||||
@ -41,46 +41,3 @@ func hypotSqrt(p, q float64) float64 {
|
|||||||
q = q / p
|
q = q / p
|
||||||
return p * Sqrt(1+q*q)
|
return p * Sqrt(1+q*q)
|
||||||
}
|
}
|
||||||
|
|
||||||
func hypotNoSqrt(p, q float64) float64 {
|
|
||||||
// TODO(rsc): Remove manual inlining of IsNaN, IsInf
|
|
||||||
// when compiler does it for us
|
|
||||||
// special cases
|
|
||||||
switch {
|
|
||||||
case p < -MaxFloat64 || p > MaxFloat64 || q < -MaxFloat64 || q > MaxFloat64: // IsInf(p, 0) || IsInf(q, 0):
|
|
||||||
return Inf(1)
|
|
||||||
case p != p || q != q: // IsNaN(p) || IsNaN(q):
|
|
||||||
return NaN()
|
|
||||||
}
|
|
||||||
if p < 0 {
|
|
||||||
p = -p
|
|
||||||
}
|
|
||||||
if q < 0 {
|
|
||||||
q = -q
|
|
||||||
}
|
|
||||||
|
|
||||||
if p < q {
|
|
||||||
p, q = q, p
|
|
||||||
}
|
|
||||||
|
|
||||||
if p == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
pfac := p
|
|
||||||
q = q / p
|
|
||||||
r := q
|
|
||||||
p = 1
|
|
||||||
for {
|
|
||||||
r = r * r
|
|
||||||
s := r + 4
|
|
||||||
if s == 4 {
|
|
||||||
return p * pfac
|
|
||||||
}
|
|
||||||
r = r / s
|
|
||||||
p = p + 2*r*p
|
|
||||||
q = q * r
|
|
||||||
r = q / p
|
|
||||||
}
|
|
||||||
panic("unreachable")
|
|
||||||
}
|
|
||||||
|
@ -3,4 +3,4 @@
|
|||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
TEXT ·Hypot(SB),7,$0
|
TEXT ·Hypot(SB),7,$0
|
||||||
B ·hypotNoSqrt(SB)
|
B ·hypot(SB)
|
||||||
|
Loading…
Reference in New Issue
Block a user