mirror of
https://github.com/golang/go
synced 2024-11-19 23:04:40 -07:00
cmath: correct IsNaN for argument cmplx(Inf, NaN)
R=rsc CC=golang-dev https://golang.org/cl/1705041
This commit is contained in:
parent
47c85ec97a
commit
9038de0373
@ -38,8 +38,7 @@ var vc = []complex128{
|
||||
// at http://keisan.casio.com/. More exact input values (array vc[], above)
|
||||
// were obtained by printing them with "%.26f". The answers were calculated
|
||||
// to 26 digits (by using the "Digit number" drop-down control of each
|
||||
// calculator). Twenty-six digits were chosen so that the answers would be
|
||||
// accurate even for a float128 type.
|
||||
// calculator).
|
||||
|
||||
var abs = []float64{
|
||||
9.2022120669932650313380972e+00,
|
||||
@ -355,6 +354,28 @@ var vcExpSC = []complex128{
|
||||
var expSC = []complex128{
|
||||
NaN(),
|
||||
}
|
||||
var vcIsNaNSC = []complex128{
|
||||
cmplx(math.Inf(-1), math.Inf(-1)),
|
||||
cmplx(math.Inf(-1), math.NaN()),
|
||||
cmplx(math.NaN(), math.Inf(-1)),
|
||||
cmplx(0, math.NaN()),
|
||||
cmplx(math.NaN(), 0),
|
||||
cmplx(math.Inf(1), math.Inf(1)),
|
||||
cmplx(math.Inf(1), math.NaN()),
|
||||
cmplx(math.NaN(), math.Inf(1)),
|
||||
cmplx(math.NaN(), math.NaN()),
|
||||
}
|
||||
var isNaNSC = []bool{
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
}
|
||||
var vcLogSC = []complex128{
|
||||
NaN(),
|
||||
}
|
||||
@ -432,7 +453,7 @@ func alike(a, b float64) bool {
|
||||
case a != a && b != b: // math.IsNaN(a) && math.IsNaN(b):
|
||||
return true
|
||||
case a == b:
|
||||
return true
|
||||
return math.Signbit(a) == math.Signbit(b)
|
||||
}
|
||||
return false
|
||||
}
|
||||
@ -454,7 +475,7 @@ func cAlike(a, b complex128) bool {
|
||||
case IsNaN(a) && IsNaN(b):
|
||||
return true
|
||||
case a == b:
|
||||
return true
|
||||
return math.Signbit(real(a)) == math.Signbit(real(b)) && math.Signbit(imag(a)) == math.Signbit(imag(b))
|
||||
}
|
||||
return false
|
||||
}
|
||||
@ -591,6 +612,13 @@ func TestExp(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
func TestIsNaN(t *testing.T) {
|
||||
for i := 0; i < len(vcIsNaNSC); i++ {
|
||||
if f := IsNaN(vcIsNaNSC[i]); isNaNSC[i] != f {
|
||||
t.Errorf("IsNaN(%g) = %g, want %g\n", vcIsNaNSC[i], f, isNaNSC[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
func TestLog(t *testing.T) {
|
||||
for i := 0; i < len(vc); i++ {
|
||||
if f := Log(vc[i]); !cVeryclose(log[i], f) {
|
||||
|
@ -6,9 +6,13 @@ package cmath
|
||||
|
||||
import "math"
|
||||
|
||||
// IsNaN returns true if either real(x) or imag(x) is NaN.
|
||||
// IsNaN returns true if either real(x) or imag(x) is NaN
|
||||
// and neither is an infinity.
|
||||
func IsNaN(x complex128) bool {
|
||||
if math.IsNaN(real(x)) || math.IsNaN(imag(x)) {
|
||||
switch {
|
||||
case math.IsInf(real(x), 0) || math.IsInf(imag(x), 0):
|
||||
return false
|
||||
case math.IsNaN(real(x)) || math.IsNaN(imag(x)):
|
||||
return true
|
||||
}
|
||||
return false
|
||||
|
Loading…
Reference in New Issue
Block a user