typedef myFLOAT Float64 / BigFloat - PullRequest
       5

typedef myFLOAT Float64 / BigFloat

2 голосов
/ 08 мая 2019

в C (++) я могу сделать в заголовочном файле myFLOAT.h

typedef myFLOAT double;
// typedef myFLOAT BigFloat; // with the correct lib

Тогда я могу написать код, основанный на типе myFLOAT и очень легко переключаться на код между double и BigFloat просто раскомментируйте / прокомментируйте соответствующую строку в заголовочном файле.

Как мне сделать то же самое в Джулии?

Я пытался

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); 

Я согласен, что я могу / должен использовать AbstractFloat "везде" в doSimulation (). Но с

const myFLOAT = Float64     # thanks

Я хочу гарантировать, что каждый myFLOAT в 'struct init' является Float64 или BigFloat в зависимости от варианта использования. Таким образом, doSimulation (init) выберет правильный тип поплавка.

Ответы [ 2 ]

1 голос
/ 08 мая 2019

В Джулии конкретные типы не могут быть подтипированы.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

Иерархия типов Джулии для чисел может быть здесь .

0 голосов
/ 08 мая 2019

Вы можете использовать синтаксис 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>
...