Complex and Rational Numbers¶
Julia ships with predefined types representing both complex and rational numbers, and supports all standard mathematical operations on them. Conversion and Promotion are defined so that operations on any combination of predefined numeric types, whether primitive or composite, behave as expected.
Complex Numbers¶
The global constant im is bound to the complex number i,
representing the principal square root of -1. It was deemed harmful to
co-opt the name i for a global constant, since it is such a popular
index variable name. Since Julia allows numeric literals to be
juxtaposed with identifiers as coefficients,
this binding suffices to provide convenient syntax for complex numbers,
similar to the traditional mathematical notation:
julia>1+2im1+2imYou can perform all the standard arithmetic operations with complex numbers:
julia>(1+2im)*(2-3im)8+1imjulia>(1+2im)/(1-2im)-0.6+0.8imjulia>(1+2im)+(1-2im)2+0imjulia>(-3+2im)-(5-1im)-8+3imjulia>(-1+2im)^2-3-4imjulia>(-1+2im)^2.52.7296244647840084-6.960664459571898imjulia>(-1+2im)^(1+1im)-0.27910381075826657+0.08708053414102428imjulia>3(2-5im)6-15imjulia>3(2-5im)^2-63-60imjulia>3(2-5im)^-1.00.20689655172413796+0.5172413793103449imThe promotion mechanism ensures that combinations of operands of different types just work:
julia>2(1-1im)2-2imjulia>(2+3im)-11+3imjulia>(1+2im)+0.51.5+2.0imjulia>(2+3im)-0.5im2.0+2.5imjulia>0.75(1+2im)0.75+1.5imjulia>(2+3im)/21.0+1.5imjulia>(1-3im)/(2+2im)-0.5-1.0imjulia>2im^2-2+0imjulia>1+3/4im1.0-0.75imNote that 3/4im==3/(4im)==-(3/4)im, since a literal
coefficient binds more tightly than division.
Standard functions to manipulate complex values are provided:
julia>real(1+2im)1julia>imag(1+2im)2julia>conj(1+2im)1-2imjulia>abs(1+2im)2.23606797749979julia>abs2(1+2im)5julia>angle(1+2im)1.1071487177940904As usual, the absolute value (abs()) of a complex number is its
distance from zero. abs2() gives the square of the
absolute value, and is of particular use for complex numbers where it
avoids taking a square root. angle() returns the phase
angle in radians (also known as the argument or arg function). The
full gamut of other Elementary Functions is also defined
for complex numbers:
julia>sqrt(1im)0.7071067811865476+0.7071067811865475imjulia>sqrt(1+2im)1.272019649514069+0.7861513777574233imjulia>cos(1+2im)2.0327230070196656-3.0518977991518imjulia>exp(1+2im)-1.1312043837568135+2.4717266720048188imjulia>sinh(1+2im)-0.4890562590412937+1.4031192506220405imNote that mathematical functions typically return real values when applied
to real numbers and complex values when applied to complex numbers.
For example, sqrt() behaves differently when applied to -1
versus -1+0im even though -1==-1+0im:
julia>sqrt(-1)ERROR:DomainError:sqrtwillonlyreturnacomplexresultifcalledwithacomplexargument.Trysqrt(complex(x)).insqrtatmath.jl:146julia>sqrt(-1+0im)0.0+1.0imThe literal numeric coefficient notation does not work when constructing complex number from variables. Instead, the multiplication must be explicitly written out:
julia>a=1;b=2;a+b*im1+2imHowever, this is not recommended; Use the complex() function instead to
construct a complex value directly from its real and imaginary parts.:
julia>complex(a,b)1+2imThis construction avoids the multiplication and addition operations.
Inf and NaN propagate through complex numbers in the real
and imaginary parts of a complex number as described in the
Special floating-point values section:
julia>1+Inf*im1.0+Inf*imjulia>1+NaN*im1.0+NaN*imRational Numbers¶
Julia has a rational number type to represent exact ratios of integers.
Rationals are constructed using the // operator:
julia>2//32//3If the numerator and denominator of a rational have common factors, they are reduced to lowest terms such that the denominator is non-negative:
julia>6//92//3julia>-4//8-1//2julia>5//-15-1//3julia>-4//-121//3This normalized form for a ratio of integers is unique, so equality of
rational values can be tested by checking for equality of the numerator
and denominator. The standardized numerator and denominator of a
rational value can be extracted using the num() and den() functions:
julia>num(2//3)2julia>den(2//3)3Direct comparison of the numerator and denominator is generally not necessary, since the standard arithmetic and comparison operations are defined for rational values:
julia>2//3==6//9truejulia>2//3==9//27falsejulia>3//7<1//2truejulia>3//4>2//3truejulia>2//4+1//62//3julia>5//12-1//41//6julia>5//8*3//125//32julia>6//5/10//721//25Rationals can be easily converted to floating-point numbers:
julia>float(3//4)0.75Conversion from rational to floating-point respects the following
identity for any integral values of a and b, with the exception
of the case a==0 and b==0:
julia>isequal(float(a//b),a/b)trueConstructing infinite rational values is acceptable:
julia>5//01//0julia>-3//0-1//0julia>typeof(ans)Rational{Int64}Trying to construct a NaN rational value, however, is not:
julia>0//0ERROR:ArgumentError:invalidrational:zero(Int64)//zero(Int64)incallatrational.jl:8in//atrational.jl:22As usual, the promotion system makes interactions with other numeric types effortless:
julia>3//5+18//5julia>3//5-0.50.09999999999999998julia>2//7*(1+2im)2//7+4//7*imjulia>2//7*(1.5+2im)0.42857142857142855+0.5714285714285714imjulia>3//2/(1+2im)3//10-3//5*imjulia>1//2+2im1//2+2//1*imjulia>1+2//3im1//1-2//3*imjulia>0.5==1//2truejulia>0.33==1//3falsejulia>0.33<1//3truejulia>1//3-0.330.0033333333333332993