// 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 native import ( "math" "gonum.org/v1/gonum/blas/blas64" ) // Drscl multiplies the vector x by 1/a being careful to avoid overflow or // underflow where possible. // // Drscl is an internal routine. It is exported for testing purposes. func (impl Implementation) Drscl(n int, a float64, x []float64, incX int) { checkVector(n, x, incX) bi := blas64.Implementation() cden := a cnum := 1.0 smlnum := dlamchS bignum := 1 / smlnum for { cden1 := cden * smlnum cnum1 := cnum / bignum var mul float64 var done bool switch { case cnum != 0 && math.Abs(cden1) > math.Abs(cnum): mul = smlnum done = false cden = cden1 case math.Abs(cnum1) > math.Abs(cden): mul = bignum done = false cnum = cnum1 default: mul = cnum / cden done = true } bi.Dscal(n, mul, x, incX) if done { break } } }