Я не понимаю, как определить типы в Юлии - PullRequest
4 голосов
/ 11 марта 2020

Я учу Джулию, и я немного запутался в Типах. Мой очень простой вопрос. Я понимаю, что если я напишу,

x = 64.0::MyType

x должно содержать значение 64, с типом, равным MyType. Но если я пишу

x = 64.0::Float32

Я получаю ошибку

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

Я обнаружил, что следующее не дает мне ошибку

x = convert(Float32,64.0)

Это правильно подходить? Это кажется слишком запутанным.

Ответы [ 4 ]

9 голосов
/ 11 марта 2020

Ответы @NilsGudat и @DaveNewton являются правильными, но неполными, поэтому позвольте мне дать некоторые уточнения.

Важно отметить, что ваш первый пример, x = 64.0::MyType, это , а не как вы создаете число типа MyType. Обозначение a::MyType, когда оно встречается в правой части выражения, является утверждением типа. Он вернет значение a, если a является подтипом MyType (a isa MyType), но если a не является подтипом MyType, будет выдано исключение. В вашем повседневном коде Джулии это вряд ли понадобится вам очень часто. Для получения дополнительной информации об объявлениях и утверждениях типа см. Раздел руководства по объявлениям типа и этого раздела из советов по производительности.

Как указывает @DaveNewton, Джулия предоставляет литерал синтаксис для создания Float32 чисел. Синтаксис аналогичен научной нотации c для Float64, например, 4.5e2, за исключением того, что e заменяется на f:

julia> 4.5f2
450.0f0

julia> 450f0
450.0f0

julia> typeof(4.5f2)
Float32

Обратите внимание, что присоединение ::Float32 к буквенное значение Float32 не является обязательным и фактически является избыточным. Поэтому вместо написания x = 64.0f0::Float32, как предлагает @DaveNewton, вы можете просто написать x = 64.0f0.

8 голосов
/ 11 марта 2020

Джулия по умолчанию Float64. Float32 литералам нужно f (в отличие от e):

x = 64.0f0::Float32

Как добавляет Ренат:

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

(Вот что я использовал для ответа на этот вопрос, так как я не знаю Джулию. Но я знаю, как искать:)

5 голосов
/ 11 марта 2020

Проблема в том, что вход 64.0 автоматически представляет собой Float64:

julia> typeof(64.0)
Float64

Поэтому вы хотите напрямую создать Float32, например, так:

julia> Float32(64.0)
64.0f0

julia> typeof(ans)
Float32
2 голосов
/ 11 марта 2020

Синтаксис, который вы записали: вы определили Float64, а затем объявили, что это должен быть Float32, и поэтому он правильно выдает ошибку, говоря, что она не совместима. 64.0 или 64e0 - это Float64, а 64f0 - это Float32. Так что x = 64f0 - это все, что вам нужно. Такие утверждения типа, как правило, не нужны, за исключением управления диспетчеризацией или определения полей структуры.

...