使用浮点输入时,在 Julia 中键入稳定函数以进行一般分发
Type stable functions in Julia for general distribution when working with floating point inputs
在 Julia 中,我有一个这样的函数:
function f(x::Float64, c::Float64)
if x <= 0
return(0.0)
elseif x <= c
return(x / c)
else
return(1.0)
end
end
该函数是类型稳定的,因此 运行 很快。但是,我想将该函数包含在用于一般分发的包中,包括 32 位机器。这里的最佳做法是什么?我是否应该为 Float32
编写另一个版本的函数(如果我有很多这样的函数,这会很烦人)?我可以使用 FloatingPoint
作为输入类型吗?如果我这样做,我如何确保函数保持类型稳定,因为 0.0
和 1.0
是 Float64
,而 x / c
可能是 Float32
或Float16
?也许我可以使用类型参数,例如T<:FloatingPoint
然后让 x::T
和 c::T
,然后在函数体中使用 0.0::T
和 1.0::T
以确保它是类型稳定的?
如有任何指导,我们将不胜感激。
one
和 zero
函数在这里很有用:
function f(x, c)
if x <= 0
return zero(x)
elseif x <= c
return x/c
else
return one(x)
end
end
这个版本对输入类型有点严格:
function f{T<:FloatingPoint}(x::T, c::T)
if x <= 0
return zero(T)
elseif x <= c
return x/c
else
return one(T)
end
end
在 Julia 中,我有一个这样的函数:
function f(x::Float64, c::Float64)
if x <= 0
return(0.0)
elseif x <= c
return(x / c)
else
return(1.0)
end
end
该函数是类型稳定的,因此 运行 很快。但是,我想将该函数包含在用于一般分发的包中,包括 32 位机器。这里的最佳做法是什么?我是否应该为 Float32
编写另一个版本的函数(如果我有很多这样的函数,这会很烦人)?我可以使用 FloatingPoint
作为输入类型吗?如果我这样做,我如何确保函数保持类型稳定,因为 0.0
和 1.0
是 Float64
,而 x / c
可能是 Float32
或Float16
?也许我可以使用类型参数,例如T<:FloatingPoint
然后让 x::T
和 c::T
,然后在函数体中使用 0.0::T
和 1.0::T
以确保它是类型稳定的?
如有任何指导,我们将不胜感激。
one
和 zero
函数在这里很有用:
function f(x, c)
if x <= 0
return zero(x)
elseif x <= c
return x/c
else
return one(x)
end
end
这个版本对输入类型有点严格:
function f{T<:FloatingPoint}(x::T, c::T)
if x <= 0
return zero(T)
elseif x <= c
return x/c
else
return one(T)
end
end