Julia - Basic Operators


Advertisements

In this chapter, we shall discuss different types of operators in Julia.

Arithmetic Operators

In Julia, we get all the basic arithmetic operators across all the numeric primitive types. It also provides us bitwise operators as well as efficient implementation of comprehensive collection of standard mathematical functions.

Following table shows the basic arithmetic operators that are supported on Julia’s primitive numeric types −

Expression Name Description
+x unary plus It is the identity operation.
-x unary minus It maps values to their additive inverses.
x + y binary plus It performs addition.
x - y binary minus It performs subtraction.
x * y times It performs multiplication.
x / y divide It performs division.
x ÷ y integer divide Denoted as x / y and truncated to an integer.
x \ y inverse divide It is equivalent to y / x.
x ^ y power It raises x to the yth power.
x % y remainder It is equivalent to rem(x,y).
!x negation It is negation on bool types and changes true to false and vice versa.

The promotion system of Julia makes these arithmetic operations work naturally and automatically on the mixture of argument types.

Example

Following example shows the use of arithmetic operators −

julia> 2+20-5
17

julia> 3-8
-5

julia> 50*2/10
10.0

julia> 23%2
1

julia> 2^4
16

Bitwise Operators

Following table shows the bitwise operators that are supported on Julia’s primitive numeric types −

Sl.No Expression Name Name
1 ∼x bitwise not
2 x & y bitwise and
3 x | y bitwise or
4 x ⊻ y bitwise xor (exclusive or)
5 x >>> y logical shift right
6 x >> y arithmetic shift right
7 x << y logical/arithmetic shift left

Example

Following example shows the use of bitwise operators −

julia> ∼1009
-1010

julia> 12&23
4

julia> 12 & 23
4

julia> 12 | 23
31

julia> 12 ⊻ 23
27

julia> xor(12, 23)
27

julia> ∼UInt32(12)
0xfffffff3

julia> ∼UInt8(12)
0xf3

Updating Operators

Each arithmetic as well as bitwise operator has an updating version which can be formed by placing an equal sign (=) immediately after the operator. This updating operator assigns the result of the operation back into its left operand. It means that a +=1 is equal to a = a+1.

Following is the list of the updating versions of all the binary arithmetic and bitwise operators −

  • +=

  • -=

  • *=

  • /=

  • \=

  • ÷=

  • %=

  • ^=

  • &=

  • |=

  • ⊻=

  • >>>=

  • >>=

  • <<=

Example

Following example shows the use of updating operators −

julia> A = 100
100

julia> A +=100
200

julia> A
200

Vectorized “dot” Operators

For each binary operation like ^, there is a corresponding “dot”(.) operation which is used on the entire array, one by one. For instance, if you would try to perform [1, 2, 3] ^ 2, then it is not defined and not possible to square an array. On the other hand, [1, 2, 3] .^ 2 is defined as computing the vectorized result. In the same sense, this vectorized “dot” operator can also be used with other binary operators.

Example

Following example shows the use of “dot” operator −

julia> [1, 2, 3].^2
3-element Array{Int64,1}:
 1
 4
 9

Numeric Comparisons Operators

Following table shows the numeric comparison operators that are supported on Julia’s primitive numeric types −

Sl.No Operator Name
1 == Equality
2 !=,≠ inequality
3 < less than
4 <=, ≤ less than or equal to
5 > greater than
6 >=, ≥ greater than or equal to

Example

Following example shows the use of numeric comparison operators −

julia> 100 == 100
true

julia> 100 == 101
false

julia> 100 != 101
true

julia> 100 == 100.0
true

julia> 100 < 500
true

julia> 100 > 500
false

julia> 100 >= 100.0
true

julia> -100 <= 100
true

julia> -100 <= -100
true

julia> -100 <= -500
false

julia> 100 < -10.0
false

Chaining Comparisons

In Julia, the comparisons can be arbitrarily chained. In case of numerical code, the chaining comparisons are quite convenient. The && operator for scalar comparisons and & operator for elementwise comparison allows chained comparisons to work fine on arrays.

Example

Following example shows the use of chained comparison −

julia> 100 < 200 <= 200 < 300 == 300 > 200 >= 100 == 100 < 300 != 500
true

In the following example, let us check out the evaluation behavior of chained comparisons −

julia> M(a) = (println(a); a)
M (generic function with 1 method)
julia> M(1) < M(2) <= M(3)
 2
 1
 3
true
julia> M(1) > M(2) <= M(3)
 2
 1
false

Operator Precedence & Associativity

From highest precedence to lowest, the following table shows the order and associativity of operations applied by Julia −

Category Operators Associativity
Syntax followed by :: Left
Exponentiation ^ Right
Unary + - √ Right
Bitshifts << >> >>> Left
Fractions // Left
Multiplication * / % & \ ÷ Left
Addition + - | ⊻ Left
Syntax : .. Left
Syntax |> Left
Syntax <| Right
Comparisons > < >= <= == === != !== <: Non-associative
Control flow && followed by || followed by ? Right
Pair => Right
Assignments = += -= *= /= //= \= ^= ÷= %= |= &= ⊻= <<= >>= >>>= Right

We can also use Base.operator_precedence function to check the numerical precedence of a given operator. The example is given below −

julia> Base.operator_precedence(:-), Base.operator_precedence(:+), Base.operator_precedence(:.)
(11, 11, 17)
Advertisements