class Complex is Cool does Numeric {}

表示复平面上的一个数。

Complex 对象是不可变的。

运算符§

后缀 i§

在数字字面量后面添加 i 将使其成为 Complex,例如

say 2i;     # same as Complex.new(0, 2); 
say 1-2e3i; # same as Complex.new(1, -2e3);

方法§

method new§

multi method new(Real $reReal $im --> Complex:D)

从实部和虚部创建一个新的Complex对象。

my $complex = Complex.new(11);
say $complex;    # OUTPUT: «1+1i␤»

在没有参数的情况下创建时,两个部分都被认为是零。

say Complex.new# OUTPUT: «0+0i␤»

方法 re§

method re(Complex:D: --> Real:D)

返回复数的实部。

say (3+5i).re;    # OUTPUT: «3␤»

方法 im§

method im(Complex:D: --> Real:D)

返回复数的虚部。

say (3+5i).im;    # OUTPUT: «5␤»

方法 reals§

method reals(Complex:D: --> Positional:D)

返回一个包含此值的实部和虚部的两个元素列表。

say (3+5i).reals;    # OUTPUT: «(3 5)␤»

方法 isNaN§

method isNaN(Complex:D: --> Bool:D)

如果实部或虚部是NaN(非数字),则返回 true。

say (NaN+5i).isNaN# OUTPUT: «True␤» 
say (7+5i).isNaN;   # OUTPUT: «False␤»

方法 polar§

method polar(Complex:D: --> Positional:D)

返回此值的极坐标的两个元素列表,即幅度和以弧度表示的角度。

say (10+7i).polar# OUTPUT: «(12.2065556157337 0.610725964389209)␤»

方法 floor§

method floor(Complex:D: --> Complex:D)

返回self.re.floor + self.im.floor。也就是说,实部和虚部都四舍五入到不超过该部分值的最高整数。

say (1.2-3.8i).floor;           # OUTPUT: «1-4i␤»

方法 ceiling§

method ceiling(Complex:D: --> Complex:D)

返回self.re.ceiling + self.im.ceiling。也就是说,实部和虚部都四舍五入到不小于该部分值的最低整数。

say (1.2-3.8i).ceiling;         # OUTPUT: «2-3i␤»

例程 sign§

method sign(Complex:D: --> Complex:D)
multi  sign(Complex:D $z --> Complex:D)

如果复数的绝对值为 0,则返回0i。否则返回复数除以其绝对值(与 $z 相同方向的单位复数)。

从 6.e 语言版本开始可用(Rakudo 编译器 2023.02+ 中存在早期实现)。

方法 round§

multi method round(Complex:D: --> Complex:D)
multi method round(Complex:D: Real() $scale --> Complex:D)

如果没有参数,则将实部和虚部都四舍五入到最接近的整数,并返回一个新的Complex数字。如果给出$scale,则将调用者的两个部分都四舍五入到$scale的最接近的倍数。对数字的每个部分使用与Real.round相同的算法。

say (1.2-3.8i).round;           # OUTPUT: «1-4i␤» 
say (1.256-3.875i).round(0.1);  # OUTPUT: «1.3-3.9i␤»

方法 truncate§

method truncate(Complex:D: --> Complex:D)

使用Real.truncate删除数字的实部和虚部的分数部分,并将结果作为新的Complex返回。

say (1.2-3.8i).truncate;        # OUTPUT: «1-3i␤»

例程 abs§

method abs(Complex:D: --> Num:D)
multi  abs(Complex:D $z --> Num:D)

返回调用者(或子形式中的参数)的绝对值。对于给定的复数$z,绝对值|$z|定义为sqrt($z.re * $z.re + $z.im * $z.im)

say (3+4i).abs;                 # OUTPUT: «5␤» 
                                # sqrt(3*3 + 4*4) == 5

方法 conj§

method conj(Complex:D: --> Complex:D)

返回调用者的复共轭(即虚部符号取反的数字)。

say (1-4i).conj;                # OUTPUT: «1+4i␤»

方法 sqrt§

method sqrt(Complex:D: --> Complex:D)

返回调用者的复平方根,即实部≥0且虚部与调用者的虚部符号相同的根。

say (3-4i).sqrt;                # OUTPUT: «2-1i␤» 
say (-3+4i).sqrt;               # OUTPUT: «1+2i␤»

方法 gist§

method gist(Complex:D: --> Str:D)

返回形式为“1+2i”的字符串表示,没有内部空格。(Str 强制转换也返回此值。)

say (1-4i).gist;                # OUTPUT: «1-4i␤»

方法 raku§

method raku(Complex:D: --> Str:D)

返回一个特定于实现的字符串,该字符串在传递给EVAL时会生成一个等效的对象。

say (1-3i).raku;                # OUTPUT: «<1-3i>␤»

方法 Real§

multi method Real(Complex:D: --> Num:D)
multi method Real(Complex:U: --> Num:D)

将调用者强制转换为Num。如果虚部不近似为零,则强制转换将失败,并显示X::Numeric::Real

:D 变体返回该强制转换的结果。:U 变体会发出有关在数字上下文中使用未初始化值的警告,然后返回值0e0

子运算符:<**>§

multi infix:<**>(Complex:D \aComplex:D \b --> Complex:D)
multi infix:<**>(Num(Real) \aComplex:D \b --> Complex:D)
multi infix:<**>(Complex:D \aNum(Real) \b --> Complex:D)

指数运算符 将第二个参数强制转换为 Complex,并计算左侧参数的右侧参数次方。 从 6.d 版本开始,两个参数都可以等于零。

say i ** i;   # OUTPUT: «0.20787957635076193+0i␤» 
say 2 ** i;   # OUTPUT: «0.7692389013639721+0.6389612763136348i␤» 
say i ** 2;   # OUTPUT: «-1+1.2246467991473532e-16i␤» 
say 0 ** i;   # OUTPUT: «0+0i␤» 
say 0** 0i; # OUTPUT: «1+0i␤»

类型图§

Complex 的类型关系
raku-type-graph Complex Complex Cool Cool Complex->Cool Numeric Numeric Complex->Numeric Mu Mu Any Any Any->Mu Cool->Any Stringy Stringy Str Str Str->Cool Str->Stringy Allomorph Allomorph Allomorph->Str ComplexStr ComplexStr ComplexStr->Complex ComplexStr->Allomorph

展开上面的图表