2 Вопрос: typedef myFLOAT Float64 / BigFloat

вопрос создан в Wed, May 8, 2019 12:00 AM

в 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) выберет правильный тип Float.

    
2
2 ответа                              2                         

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

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

1
2019-05-08 17: 32: 24Z
  1. Спасибо за ваш ответ!
    2019-05-09 08: 48: 24Z

Вы можете использовать синтаксис 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>
    
0
2019-05-08 17: 23: 59Z
  1. Обратите внимание, что объявление T <: Number позволяет T быть Complex. Обычно я объявляю T <: Real.
    2019-05-08 17: 30: 52Z
источник размещен Вот