在朱莉娅,我有这样的功能:
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
以确保它是类型稳定的?
这里的任何指导都将不胜感激。
答案 0 :(得分:11)
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