LAPACK and Blas have all these handy little routines like
dlascl - scale an array between two normalized quantities handling overflow/underflow/etc.
# _dlascl(from, to, x)
# This will compute x .*= x (to/from) and handle special cases
julia> _dlascl(1e-300, 1e300, [1e-300, 1e-301, 1e-299])
3-element Vector{Float64}:
1.0000000000000002e300
1.0000000000000002e299
1.0000000000000002e301
dlapy2 - computer sqrt(x^2+y^2) handling underflow/overflow
julia> _dlapy2(1e300,1e200)
1.0e300
julia> sqrt(1e300^2+1e200^2)
Inf
Am I missing some package/scenario in Julia where these exist? (I realize I can call BLAS/LAPACK directly, but I want to know if there’s another place I should be looking for these little micro-utilities.)
Each routine isn’t very complicated, but they are often somewhat subtle, e.g.
@inline function _dlapy2(x::T, y::T) where T
!isnan(x) || return x
!isnan(y) || return y
w = max(abs(x),abs(y))
z = min(abs(x),abs(y))
if z == 0
return w
else
return w*sqrt(1+(z/w)^2)
end
end
Apologies if I haven’t found just the right google search or my list of what I would search for wasn’t quite expansive enough.
PS - Edited for code blocks