7.3. Complex numbers#
Complex numbers can be created using the global constant im
for the imaginary unit \(\sqrt{-1}\):
a = 5 - 3im
5 - 3im
or alternatively using the syntax complex(real,imag)
:
b = complex(5,3)
5 + 3im
c = 5 + (3/4)im # Parentheses needed since 3/4im == 3/(4im)
5.0 + 0.75im
The standard operations work as expected for complex arguments:
a * b
34 + 0im
a / b
0.4705882352941177 - 0.8823529411764706im
(1 + im)^2
0 + 2im
Several functions are provided for manipulation of complex numbers (from the Julia documentation):
julia> z = 1 + 2im
1 + 2im
julia> real(1 + 2im) # real part of z
1
julia> imag(1 + 2im) # imaginary part of z
2
julia> conj(1 + 2im) # complex conjugate of z
1 - 2im
julia> abs(1 + 2im) # absolute value of z
2.23606797749979
julia> abs2(1 + 2im) # squared absolute value
5
julia> angle(1 + 2im) # phase angle in radians
1.1071487177940904
Also most elementary functions are defined for complex arguments (from the Julia documentation):
julia> sqrt(1im)
0.7071067811865476 + 0.7071067811865475im
julia> sqrt(1 + 2im)
1.272019649514069 + 0.7861513777574233im
julia> cos(1 + 2im)
2.0327230070196656 - 3.0518977991518im
julia> exp(1 + 2im)
-1.1312043837568135 + 2.4717266720048188im
julia> sinh(1 + 2im)
-0.4890562590412937 + 1.4031192506220405im
Note that these functions typically return real values when applied to real numbers and complex values when applied to complex numbers:
sqrt(-1.0 + 0im) # OK, complex input gives complex output
0.0 + 1.0im
sqrt(-1.0) # Error - real input but needs complex output
DomainError with -1.0:
sqrt will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).
Stacktrace:
[1] throw_complex_domainerror(f::Symbol, x::Float64)
@ Base.Math ./math.jl:33
[2] sqrt(x::Float64)
@ Base.Math ./math.jl:677
[3] top-level scope
@ In[8]:1
7.3.1. Example: Roots of quadratic function#
We can now update our previous example of the quadratic formula to handle all cases, including complex roots. We make sure that the argument to the sqrt
function is complex:
function roots_of_quadratic(a,b,c)
# Compute the roots of the quadratic ax^2 + bx + c = 0
d = sqrt(complex(b^2 - 4*a*c))
r1 = (-b - d) / 2a
r2 = (-b + d) / 2a
r1, r2
end
roots_of_quadratic (generic function with 1 method)
roots_of_quadratic(1,0,1)
(0.0 - 1.0im, 0.0 + 1.0im)
roots_of_quadratic(1,4,13)
(-2.0 - 3.0im, -2.0 + 3.0im)
Note that this implementation will return complex numbers even if the roots are real:
roots_of_quadratic(-1,5,6)
(6.0 + 0.0im, -1.0 - 0.0im)
If desired, one could easily write the function such that it returns real numbers for these cases.