Files
gonum/blas/testblas/zcopy.go
Vladimir Chalupecky d4b3b7957c blas/testblas: fix zsame and adjust tests
Previously, the test condition for same-ness of two
complex numbers was wrong. The presence of even a single NaN in the real
or imaginary component of either number made both numbers to be
considered same.

This fix changes the logic so that two complex numbers are considered
same if:
* both numbers have both components NaN
* both numbers have one component NaN and the other is exactly equal
* both numbers have both components exactly equal
2017-12-06 12:15:57 +01:00

77 lines
1.6 KiB
Go

// Copyright ©2017 The Gonum Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package testblas
import (
"fmt"
"math"
"math/cmplx"
"testing"
"golang.org/x/exp/rand"
)
type Zcopyer interface {
Zcopy(n int, x []complex128, incX int, y []complex128, incY int)
}
func ZcopyTest(t *testing.T, impl Zcopyer) {
rnd := rand.New(rand.NewSource(1))
for n := 0; n <= 20; n++ {
for _, inc := range allPairs([]int{-7, -3, 1, 13}, []int{-11, -5, 1, 17}) {
incX := inc[0]
incY := inc[1]
aincX := abs(incX)
aincY := abs(incY)
var x []complex128
if n > 0 {
x = make([]complex128, (n-1)*aincX+1)
}
for i := range x {
x[i] = complex(math.NaN(), math.NaN())
}
for i := 0; i < n; i++ {
x[i*aincX] = complex(rnd.NormFloat64(), rnd.NormFloat64())
}
xCopy := make([]complex128, len(x))
copy(xCopy, x)
var y []complex128
if n > 0 {
y = make([]complex128, (n-1)*aincY+1)
}
for i := range y {
y[i] = complex(math.NaN(), math.NaN())
}
want := make([]complex128, len(y))
for i := range want {
want[i] = cmplx.NaN()
}
if incX*incY > 0 {
for i := 0; i < n; i++ {
want[i*aincY] = x[i*aincX]
}
} else {
for i := 0; i < n; i++ {
want[i*aincY] = x[(n-1-i)*aincX]
}
}
impl.Zcopy(n, x, incX, y, incY)
prefix := fmt.Sprintf("Case n=%v,incX=%v,incY=%v:", n, incX, incY)
if !zsame(x, xCopy) {
t.Errorf("%v: unexpected modification of x", prefix)
}
if !zsame(y, want) {
t.Errorf("%v: unexpected y:\nwant %v\ngot %v", prefix, want, y)
}
}
}
}