【问题标题】:How to define "complex Float64" variable in Julia?如何在 Julia 中定义“复杂的 Float64”变量?
【发布时间】:2021-07-27 08:09:34
【问题描述】:

我有一个模块,比如说,叫做常量,

module Constants
const zero = 0.0 :: Float64
const czero = 0.0 + 0.0im :: Complex
end

我知道我可以将零定义为 Float64。但是如何定义“Complex”和“Float64”变量,例如 czero?目前我使用复杂,但我想更具体。如果我使用 ComplexF64

const czero = 0.0 + 0.0im :: ComplexF64

它给了我一个错误,

ERROR: LoadError: TypeError: in typeassert, expected Complex{Float64}, got a value of type Complex{Bool}

那么我应该使用哪种具体类型的 Complex? 我给每个变量一个具体的类型是因为我听说如果代码看起来像 Fortran,它可以像 Fortran 一样运行,因为我先定义了类型,所以 Julia 不必转换可能很慢的类型。

【问题讨论】:

  • TypeError 是因为它被解析为0.0 + 0.0(im :: ComplexF64),你断言imComplexF64 类型,但想要(0.0 + 0.0im)::ComplexF64。如下所述,您可能不想这样做。
  • 请注意,按照惯例,在 Julia 中,您不会在 :: 之前和之后放置空格。这只是一个风格问题
  • 我又删除了fortran

标签: julia


【解决方案1】:

这个问题不是很清楚,但是你需要的是zero:

julia> zero(ComplexF64)
0.0 + 0.0im

julia> dump(zero(ComplexF64))
ComplexF64
  re: Float64 0.0
  im: Float64 0.0

其他选项包括使用构造函数,例如 ComplexF64(0.0)ComplexF64(0.0,0.0) 或使用 complex(0.0) 函数。这些都是类型稳定的。

【讨论】:

    【解决方案2】:
      ::
    
      With the ::-operator type annotations are attached to expressions and variables in programs. See the manual section on Type Declarations.
    
      Outside of declarations :: is used to assert that expressions and variables in programs have a given type.
    
      Examples
      ≡≡≡≡≡≡≡≡≡≡
    
      julia> (1+2)::AbstractFloat
      ERROR: TypeError: typeassert: expected AbstractFloat, got a value of type Int64
      
      julia> (1+2)::Int
      3
    

    考虑到这一点,显然 julia 认为由于运算符优先级而声明无效,因此如果您想以这种方式进行声明,只需加上括号

    const czero = (0.0 + 0.0im) ::ComplexF64
    

    我也赞同上述观点:如果你只是想声明零,那么你需要的是zero

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多