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

问题描述 投票:3回答:4

我正在学习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)

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

types julia
4个回答
4
投票

问题是输入64.0自动为Float64

julia> typeof(64.0)
Float64

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

julia> Float32(64.0)
64.0f0

julia> typeof(ans)
Float32

6
投票

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

x = 64.0f0::Float32

正如雷纳特补充:

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

((我不知道朱莉娅,所以我经常回答这个问题。但是我知道如何搜索:)


5
投票

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

重要的是要注意,第一个示例x = 64.0::MyTypenot如何创建类型为MyType的数字。当符号a::MyType出现在表达式的右侧时,它是类型断言。如果aaMyType)的子类型,它将返回a isa MyType的值,但是如果a不是MyType的子类型,则抛出异常。在日常的Julia代码中,您不太可能经常需要此代码。有关类型声明和断言的更多信息,请参见性能提示中有关type declarationsthis 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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.