我正在学习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)
这是正确的方法吗?似乎太令人费解了。
答案 0 :(得分:9)
@NilsGudat和@DaveNewton的答案都是正确的,但是不完整,所以让我详细说明一下。
重要的是要注意,第一个示例x = 64.0::MyType
不是不是创建数字类型MyType
的方法。 a::MyType
符号出现在表达式的右侧时,是类型断言。如果a
是a
(MyType
)的子类型,但是如果a isa MyType
不是{{1}的子类型,它将返回a
的值。 }它引发异常。在日常的Julia代码中,您不太可能经常需要此代码。有关类型声明和断言的更多信息,请参见性能提示中关于type declarations和this 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默认为Float64
。 Float32
文字需要一个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.0
或64e0
是Float64,而64f0
是Float32。因此,x = 64f0
就是您所需要的。除了控制调度或定义结构的字段外,通常不需要此类断言。