# Work around for `eigvals!(Matrix{Dec64})`?

Reading the code for `eigvals!`, it always tries to promote the matrix to some kind of “normal” float so it can work with `LAPACK.geevx!`… I think. But that clearly defeats the purpose of using something like DecFP.

``````julia> using DecFP, LinearAlgebra

julia> p = [d"4" d"7"; d"1" d"30"]
2×2 Matrix{Dec64}:
4.0   7.0
1.0  30.0

julia> eigvals!(p)
ERROR: MethodError: no method matching eigvals!(::Matrix{Dec64})

``````

Why doesn’t Julia have a default function for `eigvals` that doesn’t rely on external libraries? Is there a package that solves this?

Could you check if GitHub - JuliaLinearAlgebra/GenericLinearAlgebra.jl: Generic numerical linear algebra in Julia helps with this?

Computing eigenvalues inherently defeats the purpose of using a type like `Dec64`. Even if the input matrix consists of exact `Dec64` decimals, the eigenvalues/vectors will generally not be decimal and will have roundoff errors. So you might as well convert the matrix to `Float64` when calling `eigvals`.

Because eigenvalue computation is extremely nontrivial, so it’s not a matter of just writing a 60-line textbook-style fallback function like we can for LU factorization. That’s why eigenvalue computation for generic number types was left to packages like GenericLinearAlgebra.jl and GenericSchur.jl.

But in the case of `Dec64`, as I said above, you might as well convert to `Float64` and use the high-performance LAPACK implementation. (There is more benefit to generic linear algebra if you have an extended-precision type like `Dec128`, but even then it is probably faster to go with a binary FP type like DoubleFloats than to use slow software-based decimal FP.)

Really, the only reason to use decimal FP is in situations where you need to exactly preserve human inputs and exact calculations thereon, e.g. for financial records. (Or for pedagogy.)

1 Like