Thanks for bringing this to the discussion @lance_xwq !
Here’s a follow up: How consistent should the NaN*false
behaviour be treated? As an example:
julia> using LinearAlgebra
julia> x, A, y = fill(NaN32, 2), fill(NaN32, 2, 2), fill(NaN32, 2)
(Float32[NaN, NaN], Float32[NaN NaN; NaN NaN], Float32[NaN, NaN])
julia> mul!(y, A, x, false, false) # stops the NaN propagation
2-element Vector{Float32}:
0.0
0.0
julia> x, A, y = fill(NaN16, 2), fill(NaN16, 2, 2), fill(NaN16, 2)
(Float16[NaN, NaN], Float16[NaN NaN; NaN NaN], Float16[NaN, NaN])
julia> mul!(y, A, x, false, false) # does NOT stop the NaN's
2-element Vector{Float16}:
NaN
NaN
julia> X, A, Y = fill(NaN16, 2, 2), fill(NaN16, 2, 2), fill(NaN16, 2, 2)
(Float16[NaN NaN; NaN NaN], Float16[NaN NaN; NaN NaN], Float16[NaN NaN; NaN NaN])
julia> mul!(Y, A, X, false, false) # however, matmatmul does
2×2 Matrix{Float16}:
0.0 0.0
0.0 0.0
Is this worth an issue?