我正在学习Julia,而我对Types有点困惑。排雷是一个非常基本的问题。我了解如果我写
x = 64.0::MyType
x应该包含值64,类型等于MyType。但是如果我写
x = 64.0::Float32
我收到错误
ERROR: TypeError: in typeassert, expected Float32, got Float64
我发现以下内容没有给我错误
x = convert(Float32,64.0)
这是正确的方法吗?似乎太令人费解了。
问题是输入64.0
自动为Float64
:
julia> typeof(64.0)
Float64
因此,您希望像这样直接构建Float32
:
julia> Float32(64.0)
64.0f0
julia> typeof(ans)
Float32
Julia默认为Float64
。 Float32
文字需要一个f
(而不是e
):
x = 64.0f0::Float32
正如雷纳特补充:
https://docs.julialang.org/en/v1/manual/integers-and-floating-point-numbers/
((我不知道朱莉娅,所以我经常回答这个问题。但是我知道如何搜索:)
@ NilsGudat和@DaveNewton的答案都是正确的,但不完整,所以让我详细说明一下。
重要的是要注意,第一个示例x = 64.0::MyType
是not如何创建类型为MyType
的数字。当符号a::MyType
出现在表达式的右侧时,它是类型断言。如果a
是a
(MyType
)的子类型,它将返回a isa MyType
的值,但是如果a
不是MyType
的子类型,则抛出异常。在日常的Julia代码中,您不太可能经常需要此代码。有关类型声明和断言的更多信息,请参见性能提示中有关type declarations和this section的手册部分。
正如@DaveNewton所指出的,Julia提供了用于创建literal数字的Float32
语法。语法类似于Float64
的科学表示法,例如4.5e2
,除了e
替换为f
:
julia> 4.5f2
450.0f0
julia> 450f0
450.0f0
julia> typeof(4.5f2)
Float32
请注意,将::Float32
附加到Float32
文字值不是必需的,实际上是多余的。因此,您不必编写@DaveNewton建议的x = 64.0f0::Float32
,而只需编写x = 64.0f0
。
您写下的语法是,您定义了Float64,然后声明它应该为Float32,因此它正确地引发了一个错误,说这不兼容。 64.0
或64e0
是Float64,而64f0
是Float32。因此,您只需要x = 64f0
。除了控制调度或定义结构的字段外,通常不需要此类断言。