Complex number
is Cool does Numeric
Represents a number in the complex plane.
Complex objects are immutable.
Adding a trailing i
to a number literal makes it a Complex, for example:
say 2i; # same as Complex.new(0, 2);say 1-2e3i; # same as Complex.new(1, -2e3);
multi method new(Real , Real --> Complex)
Creates a new Complex
object from real and imaginary parts.
my = Complex.new(1, 1);say ; # OUTPUT: «1+1i»
When created without arguments, both parts are considered to be zero.
say Complex.new; # OUTPUT: «0+0i»
method re(Complex: --> Real)
Returns the real part of the complex number.
say (3+5i).re; # OUTPUT: «3»
method im(Complex: --> Real)
Returns the imaginary part of the complex number.
say (3+5i).im; # OUTPUT: «5»
method reals(Complex: --> Positional)
Returns a two-element list containing the real and imaginary parts for this value.
say (3+5i).reals; # OUTPUT: «(3 5)»
method isNaN(Complex: --> Bool)
Returns true if the real or imaginary part is NaN
(not a number).
say (NaN+5i).isNaN; # OUTPUT: «True»say (7+5i).isNaN; # OUTPUT: «False»
method polar(Complex: --> Positional)
Returns a two-element list of the polar coordinates for this value, i.e. magnitude and angle in radians.
say (10+7i).polar; # OUTPUT: «(12.2065556157337 0.610725964389209)»
method floor(Complex: --> Complex)
Returns self.re.floor + self.im.floor
. That is, each of the real and imaginary parts is rounded to the highest integer not greater than the value of that part.
say (1.2-3.8i).floor; # OUTPUT: «1-4i»
method ceiling(Complex: --> Complex)
Returns self.re.ceiling + self.im.ceiling
. That is, each of the real and imaginary parts is rounded to the lowest integer not less than the value of that part.
say (1.2-3.8i).ceiling; # OUTPUT: «2-3i»
multi method round(Complex: --> Complex)multi method round(Complex: Real() --> Complex)
With no arguments, rounds both the real and imaginary parts to the nearest integer and returns a new Complex
number. If $scale
is given, rounds both parts of the invocant to the nearest multiple of $scale
. Uses the same algorithm as Real.round on each part of the number.
say (1.2-3.8i).round; # OUTPUT: «1-4i»say (1.256-3.875i).round(0.1); # OUTPUT: «1.3-3.9i»
method truncate(Complex: --> Complex)
Removes the fractional part of both the real and imaginary parts of the number, using Real.truncate, and returns the result as a new Complex
.
say (1.2-3.8i).truncate; # OUTPUT: «1-3i»
method abs(Complex: --> Num)multi sub abs(Complex --> Num)
Returns the absolute value of the invocant (or the argument in sub form). For a given complex number $z
the absolute value |$z|
is defined as sqrt($z.re * $z.re + $z.im * $z.im)
.
say (3+4i).abs; # OUTPUT: «5»# sqrt(3*3 + 4*4) == 5
method conj(Complex: --> Complex)
Returns the complex conjugate of the invocant (that is, the number with the sign of the imaginary part negated).
say (1-4i).conj; # OUTPUT: «1+4i»
method sqrt(Complex: --> Complex)
Returns the complex square root of the invocant, i.e. the root where the real part is ≥ 0 and the imaginary part has the same sign as the imaginary part of the invocant.
say (3-4i).sqrt; # OUTPUT: «2-1i»say (-3+4i).sqrt; # OUTPUT: «1+2i»
method gist(Complex: --> Str)
Returns a string representation of the form "1+2i", without internal spaces. (Str coercion also returns this.)
say (1-4i).gist; # OUTPUT: «1-4i»
method raku(Complex: --> Str)
Returns an implementation-specific string that produces an equivalent object when given to EVAL.
say (1-3i).raku; # OUTPUT: «<1-3i>»
multi method Real(Complex: --> Num)multi method Real(Complex: --> Num)
Coerces the invocant to Num. If the imaginary part isn't approximately zero, coercion fails with X::Numeric::Real
.
The :D
variant returns the result of that coercion. The :U
variant issues a warning about using an uninitialized value in numeric context and then returns value 0e0
.
multi sub infix:<**>(Complex \a, Complex \b --> Complex)multi sub infix:<**>(Num(Real) \a, Complex \b --> Complex)multi sub infix:<**>(Complex \a, Num(Real) \b --> Complex)
The exponentiation operator coerces the second argument to Complex and calculates the left-hand-side raised to the power of the right-hand side. Since 6.d, either argument can be equal to zero.
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 0i ** 0i; # OUTPUT: «1+0i»