typedef myFLOAT Float64 / BigFloat

时间:2019-05-08 16:13:35

标签: julia

在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类型。

2 个答案:

答案 0 :(得分:1)

在Julia中,不能对具体类型进行子类型化。 Float64BigFloat都是具体类型,这就是为什么您会收到无效的子键入错误的原因。您尝试执行的操作的直接翻译是创建类型别名:

const MyType = Float64

但是,朱利安方法是使用尽可能通用的类型来定义您的类型和方法。您可以使用AbstractFloat。然后,您的代码将与Float64BigFloat一起使用。例如,

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>