// Copyright ©2016 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 ( "fmt" "math" "testing" ) type Dlae2er interface { Dlae2(a, b, c float64) (rt1, rt2 float64) } func Dlae2Test(t *testing.T, impl Dlae2er) { for _, test := range []struct { a, b, c float64 }{ {-10, 5, 3}, {3, 5, -10}, {0, 3, 0}, {1, 3, 1}, {1, -3, 1}, {5, 0, 3}, {3, 0, -5}, {1, 3, 1.02}, {1.02, 3, 1}, {1, -3, -9}, } { a := test.a b := test.b c := test.c rt1, rt2 := impl.Dlae2(a, b, c) errStr := fmt.Sprintf("a = %v, b = %v, c = %v", a, b, c) // Check if rt1 and rt2 are eigenvalues by checking if det(a - λI) = 0 a1 := a - rt1 c1 := c - rt1 det := a1*c1 - b*b if math.Abs(det) > 1e-10 { t.Errorf("First eigenvalue mismatch. %s. Det = %v", errStr, det) } a2 := a - rt2 c2 := c - rt2 det = a2*c2 - b*b if math.Abs(det) > 1e-10 { t.Errorf("Second eigenvalue mismatch. %s. Det = %v", errStr, det) } } }