3.5 复数型
复数与有理数类型一样,也是一个二元数,在高等数学与信号处理中经常涉及。Julia也内置了复数型,并提供了各种常用的运算。
复数同样是一个参数化的类型,其原型为:
Complex{T <: Real} <: Number
其中,Number是抽象类型,表示Complex是数值类型的一种;而{T<:Real}表示实部与虚部的类型T可以是Real类型的任一种,包括各种浮点型、整数型、有理数Rational型及无理数AbstractIrrational型(Irrational的父类型)等。
特别地,当T取Float16、Float32及Float64时,对应的复数型分别为Complex{Float16}、Complex{Float32}及Complex{Float64}。为了方便,Julia为它们提供了别名,即ComplexF16、ComplexF32和ComplexF64。
在创建Complex数值对象时,也可以像整型、浮点型、有理数型那样以字面值的方式提供,格式为“实部+虚部im”。为了避免歧义,其中的虚部标识采用了im,对应于数学中的虚部单位i,例如:
julia> 1 + 2im 1 + 2im
如上所示,虚部可由数值紧跟im构成。
若没有提供虚部值,会默认为1,例如:
julia> 1+im 1 + 1im
若不提供实部,则会默认为0,例如:
julia> 2im 0 + 2im
但如果使用变量提供虚部值,则需将变量与虚部单位明确的采用乘号表示出来,例如:
julia> a = 1; b = 2; julia> a + b*im 1 + 2im julia> 1 + Inf*im 1.0 + Inf*im julia> 1 + NaN*im 1.0 + NaN*im
但是这种用乘号表示的复数并不推荐,因为很容易与常规的乘法冲突,所以建议使用函数complex()构造复数,例如:
julia> complex(a, b) 1 + 2im
该函数创建的Complex类型会由Julia自动确定。
当然也可以使用复数类型声明的构造方法(后面会介绍)创建Complex类型,例如:
julia> ComplexF32(1.0, 2.0) 1.0f0 + 2.0f0im
这种方式可以限定创建对象的类型。
正如类型的声明所述,除了整型与浮点型外,其他类型的实数也是可用于创建Complex对象的,例如:
julia> using Base.MathConstants julia> complex(γ,π) 0.5772156649015329 + 3.141592653589793im julia> typeof(ans) Complex{Float64} # 无理数Irrational型变成了浮点型 julia> complex(1//2, 2//3) 1//2 + 2//3*im julia> typeof(ans) Complex{Rational{Int64}}
在数学上,复数有着各种操作,比如求共轭,取绝对值,算模的值或相位角等,这些操作在Julia中也都可以实现,如表3-5所示。
表3-5 复数的操作