// Copyright ©2015 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 testlapack import ( "math" "testing" "gonum.org/v1/gonum/floats" ) type Drscler interface { Drscl(n int, a float64, x []float64, incX int) } func DrsclTest(t *testing.T, impl Drscler) { for _, test := range []struct { x []float64 a float64 }{ { x: []float64{1, 2, 3, 4, 5}, a: 4, }, { x: []float64{1, 2, 3, 4, 5}, a: math.MaxFloat64, }, { x: []float64{1, 2, 3, 4, 5}, a: 1e-307, }, } { xcopy := make([]float64, len(test.x)) copy(xcopy, test.x) // Cannot test the scaling directly because of floating point scaling issues // (the purpose of Drscl). Instead, check that scaling and scaling back // yeilds approximately x. If overflow or underflow occurs then the scaling // won't match. impl.Drscl(len(test.x), test.a, xcopy, 1) if floats.Equal(xcopy, test.x) { t.Errorf("x unchanged during call to drscl. a = %v, x = %v.", test.a, test.x) } impl.Drscl(len(test.x), 1/test.a, xcopy, 1) if !floats.EqualApprox(xcopy, test.x, 1e-14) { t.Errorf("x not equal after scaling and unscaling. a = %v, x = %v.", test.a, test.x) } } }