我不明白如何在Julia中定义类型

时间:2020-03-11 14:41:31

标签: types julia

我正在学习Julia,而我对Types感到有些困惑。 排雷是一个非常基本的问题。我知道如果我写

x = 64.0::MyType

x应包含值64,且Type等于MyType。但是如果我写

x = 64.0::Float32

我得到了错误

ERROR: TypeError: in typeassert, expected Float32, got Float64

我发现以下内容没有给我错误

x = convert(Float32,64.0)

这是正确的方法吗?似乎太令人费解了。

4 个答案:

答案 0 :(得分:9)

@NilsGudat和@DaveNewton的答案都是正确的,但是不完整,所以让我详细说明一下。

重要的是要注意,第一个示例x = 64.0::MyType不是不是创建数字类型MyType的方法。 a::MyType符号出现在表达式的右侧时,是类型断言。如果aaMyType)的子类型,但是如果a isa MyType不是{{1}的子类型,它将返回a的值。 }它引发异常。在日常的Julia代码中,您不太可能经常需要此代码。有关类型声明和断言的更多信息,请参见性能提示中关于type declarationsthis section的手册部分。

正如@DaveNewton所指出的,Julia提供了literal语法来创建MyType数字。语法类似于Float32的科学表示法,例如Float64,但将4.5e2替换为e

f

请注意,没有必要将julia> 4.5f2 450.0f0 julia> 450f0 450.0f0 julia> typeof(4.5f2) Float32 附加到::Float32文字值上,实际上是多余的。因此,您不必编写@DaveNewton建议的Float32,而只需编写x = 64.0f0::Float32

答案 1 :(得分:8)

Julia默认为Float64Float32文字需要一个f(而不是e):

x = 64.0f0::Float32

正如雷纳特所说:

https://docs.julialang.org/en/v1/manual/integers-and-floating-point-numbers/

(由于我不认识朱莉娅,因此我经常回答这个问题。但是我知道如何搜索:)

答案 2 :(得分:5)

问题是输入64.0自动是Float64

julia> typeof(64.0)
Float64

因此,您想像这样直接构建Float32

julia> Float32(64.0)
64.0f0

julia> typeof(ans)
Float32

答案 3 :(得分:2)

您写下的语法是,您定义了Float64,然后声明它应该是Float32,因此它正确地引发了一个错误,指出这不兼容。 64.064e0是Float64,而64f0是Float32。因此,x = 64f0就是您所需要的。除了控制调度或定义结构的字段外,通常不需要此类断言。