mirror of
https://github.com/golang/go
synced 2024-11-18 09:54:57 -07:00
math/cmplx: prevent infinite loop in tanSeries
The condition to determine if any further iterations are needed is evaluated to false in case it encounters a NaN. Instead, flip the condition to keep looping until the factor is greater than the machine roundoff error. Updates #17577 Change-Id: I058abe73fcd49d3ae4e2f7b33020437cc8f290c3 Reviewed-on: https://go-review.googlesource.com/31952 Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
a2f77e9ef8
commit
5a9549260d
@ -759,6 +759,14 @@ func TestTanh(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// See issue 17577
|
||||||
|
func TestInfiniteLoopIntanSeries(t *testing.T) {
|
||||||
|
want := Inf()
|
||||||
|
if got := Cot(0); got != want {
|
||||||
|
t.Errorf("Cot(0): got %g, want %g", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkAbs(b *testing.B) {
|
func BenchmarkAbs(b *testing.B) {
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
Abs(complex(2.5, 3.5))
|
Abs(complex(2.5, 3.5))
|
||||||
|
@ -139,7 +139,9 @@ func tanSeries(z complex128) float64 {
|
|||||||
t = y2 - x2
|
t = y2 - x2
|
||||||
t /= f
|
t /= f
|
||||||
d += t
|
d += t
|
||||||
if math.Abs(t/d) <= MACHEP {
|
if !(math.Abs(t/d) > MACHEP) {
|
||||||
|
// Caution: Use ! and > instead of <= for correct behavior if t/d is NaN.
|
||||||
|
// See issue 17577.
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user