2 typedef myFLOAT Float64 / BigFloat

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

trong C (++) Tôi có thể làm trong tệp tiêu đề myFLOAT.h

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

Sau đó, tôi có thể viết mã dựa trên loại myFLOAT và chuyển đổi rất dễ dàng cho mã giữa double và BigFloat chỉ cần bỏ ghi chú /bình luận dòng tương ứng trong tệp tiêu đề.

Làm cách nào để tôi làm điều tương tự ở Julia?

Tôi đã thử

abstract type myFLOAT <: Float64 end
#abstract type myFLOAT <: BigFloat end

nhưng tôi nhận được

ERROR: invalid subtyping in definition of myFLOAT

Tôi thêm nhận xét sau câu trả lời từ @clbieganek

Mã mô phỏng của tôi thường trông giống như

init = initSimulation(args);
result = doSimulation(init);
Plotting(result); 

Tôi đồng ý rằng tôi có thể /nên sử dụng AbstractFloat "ở mọi nơi" trong doSimulation (). Nhưng với

const myFLOAT = Float64     # thanks

Tôi muốn đảm bảo rằng mọi myFLOAT trong 'struct init' là Float64 hoặc BigFloat tùy thuộc vào trường hợp sử dụng. Cách này 'doSimulation (init)' sẽ chọn đúng kiểu Float.

    
2
2 Câu trả lời                              2                         

Ở Julia, các loại bê tông không thể được nhập phụ. Float64BigFloat đều là các loại cụ thể, đó là lý do tại sao bạn nhận được lỗi gõ phụ không hợp lệ. Bản dịch trực tiếp những gì bạn đang cố gắng làm là tạo một bí danh loại:

const MyType = Float64

Tuy nhiên, cách tiếp cận Julian là xác định các loại và phương thức của bạn bằng cách sử dụng các loại chung nhất có thể. Trong trường hợp của bạn, bạn có thể sử dụng AbstractFloat. Sau đó, mã của bạn sẽ hoạt động với cả Float64BigFloat. Ví dụ:

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

Hệ thống phân cấp loại Julia cho các số có thể được xem tại đây .

    
1
2019-05-08 17: 32: 24Z
  1. Cảm ơn bạn đã trả lời!
    2019-05-09 08: 48: 24Z

Bạn có thể sử dụng cú pháp where cho các hàm và sử dụng cú pháp như T, sau đó, cho một trong hai:

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. Lưu ý rằng việc khai báo T <: Number cho phép TComplex.
    2019-05-08 17: 30: 52Z
    T <: Real
nguồn đặt đây