github.com/gonum/lapack@v0.0.0-20181123203213-e4cdc5a0bff9/testlapack/drscl.go (about)

     1  // Copyright ©2015 The gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package testlapack
     6  
     7  import (
     8  	"math"
     9  	"testing"
    10  
    11  	"github.com/gonum/floats"
    12  )
    13  
    14  type Drscler interface {
    15  	Drscl(n int, a float64, x []float64, incX int)
    16  }
    17  
    18  func DrsclTest(t *testing.T, impl Drscler) {
    19  	for _, test := range []struct {
    20  		x []float64
    21  		a float64
    22  	}{
    23  		{
    24  			x: []float64{1, 2, 3, 4, 5},
    25  			a: 4,
    26  		},
    27  		{
    28  			x: []float64{1, 2, 3, 4, 5},
    29  			a: math.MaxFloat64,
    30  		},
    31  		{
    32  			x: []float64{1, 2, 3, 4, 5},
    33  			a: 1e-307,
    34  		},
    35  	} {
    36  		xcopy := make([]float64, len(test.x))
    37  		copy(xcopy, test.x)
    38  
    39  		// Cannot test the scaling directly because of floating point scaling issues
    40  		// (the purpose of Drscl). Instead, check that scaling and scaling back
    41  		// yeilds approximately x. If overflow or underflow occurs then the scaling
    42  		// won't match.
    43  		impl.Drscl(len(test.x), test.a, xcopy, 1)
    44  		if floats.Equal(xcopy, test.x) {
    45  			t.Errorf("x unchanged during call to drscl. a = %v, x = %v.", test.a, test.x)
    46  		}
    47  		impl.Drscl(len(test.x), 1/test.a, xcopy, 1)
    48  		if !floats.EqualApprox(xcopy, test.x, 1e-14) {
    49  			t.Errorf("x not equal after scaling and unscaling. a = %v, x = %v.", test.a, test.x)
    50  		}
    51  	}
    52  }