在C(++)中,我可以在头文件myFLOAT.h中完成
typedef myFLOAT double;
// typedef myFLOAT BigFloat; // with the correct lib
然后我可以根据myFLOAT类型编写代码 并非常容易地在double和BigFloat之间切换代码 只需取消注释/注释相应的行 在头文件中。
在Julia中我该怎么做?
我尝试了
abstract type myFLOAT <: Float64 end
#abstract type myFLOAT <: BigFloat end
但我知道
ERROR: invalid subtyping in definition of myFLOAT
我在@clbieganek的答案后添加以下评论
我的模拟代码通常看起来像
init = initSimulation(args);
result = doSimulation(init);
Plotting(result);
我同意我可以/应该在doSimulation()中使用“无处不在” AbstractFloat。 但是使用
const myFLOAT = Float64 # thanks
我想保证“ struct init”中的每个myFLOAT都是Float64或BigFloat,具体取决于用例。这样,“ doSimulation(init)”将选择 正确的Float类型。
答案 0 :(得分:1)
在Julia中,不能对具体类型进行子类型化。 Float64
和BigFloat
都是具体类型,这就是为什么您会收到无效的子键入错误的原因。您尝试执行的操作的直接翻译是创建类型别名:
const MyType = Float64
但是,朱利安方法是使用尽可能通用的类型来定义您的类型和方法。您可以使用AbstractFloat
。然后,您的代码将与Float64
和BigFloat
一起使用。例如,
julia> struct A
x::AbstractFloat
end
julia> function foo(a::A, x::AbstractFloat)
return a.x + x
end
foo (generic function with 1 method)
julia> a1 = A(4.5)
A(4.5)
julia> foo(a1, 5.2)
9.7
julia> a2 = A(BigFloat(4.5))
A(4.5)
julia> foo(a2, BigFloat(5.2))
9.70000000000000017763568394002504646778106689453125
数字的Julia类型层次结构可以为viewed here。
答案 1 :(得分:0)
您可以对函数使用where语法,然后对其中之一使用T等语法。
julia> function f(a::T) where T <: Number
ret = zeros(T, 5, 5)
ret
end
f (generic function with 1 method)
julia> x = 1.0
1.0
julia> f(x)
5×5 Array{Float64,2}:
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
julia> y = BigFloat(1.0)
1.0
julia> f(y)
5×5 Array{BigFloat,2}:
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
julia>