This is related to Analogue of zero(T) for infinitiy - #5 by rdeits , but the suggestion
T(Inf)
isn’t as fast as expected. In particular,
julia> @btime convert(Float16, $(Ref(Inf))[]);
9.205 ns (0 allocations: 0 bytes)
but I know statically that the answer must be Inf16, so ideally this shouldn’t carry out any conversion at all. Is there a faster way to compute this result?
Is that really testing what you want? I’ve never used Refs in timing, have seen it recommended, but I’m not sure exactly what happens behind the scenes. I would do
julia> @btime convert(Float16, x) setup=(x=Inf)
1.691 ns (0 allocations: 0 bytes)
Inf16
julia> @code_llvm convert(Float16, Inf)
; @ number.jl:7 within `convert`
define half @julia_convert_992(double %0) #0 {
top:
; ┌ @ float.jl:232 within `Float16`
%1 = fptrunc double %0 to half
; └
ret half %1
}
which seems fast and comes down to a single llvm instruction.
Wouldn’t typemax(T) be a good way to get infinity for the types that support it, and for those that don’t you get the closest approximation?
Elrod
October 11, 2022, 3:03pm
3
In general, const prop would handle this.
julia> inf(::Type{T}) where {T} = convert(T, Inf)
inf (generic function with 1 method)
julia> @code_typed inf(Float16)
CodeInfo(
1 ─ return Inf16
) => Float16
but yeah, I’d use typemax(Float16).
julia> @code_typed typemax(Float16)
CodeInfo(
1 ─ return Inf16
) => Float16
given it’s already defined and does what you want.