День 1 Летней школы Julia 2025
Арифметические операции над числами
Мы с вами уже видели привычные операции сложения, вычитания, умножения, деления и возведения в степень.
Но теперь рассмотрим другие основные операции в Julia.
+ - * / ^
Деление
Мы рассмотрим лишь некоторую часть встроенных операций.
Все функции деления можно посмотреть в документации
При делении / целого на целое всегда получаем Float.
14 / 7
Используя символ обратной косой черты получаем деление справа-налево
3 \ 21
Если хотим целочисленное деление - используем знак, \div или же функцию div - От слова divide. Она нам покажет,сколько целых частей содержится в другом числе. 17 это 2 на 6 + 5
14 ÷ 7
div(3,5)
17 ÷ 6
Остаток
Чтобы получить остаток от деления - можно либо использовать знак процента, либо же использовать функцию rem - remainder.
7 % 3
rem(7,3)
При этом важно понимать, что остаток может быть отрицательным. И его знак соответствует знаку делимого.
rem(-7,3) # -3*2 + (-1)
Функция же mod позволяет похожа на остаток, но ведёт себя по-другому. Её знак соответствует знаку делимого. И если делитель будет положительным, то знак делимого не будет влиять на знак результата.
mod(7,3)
mod(7,3) # -3 * 3 + 2
Для того чтобы посмотреть документацию функции mod можно воспользоваться вызовом @doc mod.
; означает то, что не нужно последний результат выводить в ячейку вывода
@doc mod;
Логические операторы
Теперь перейдём к логическим операторам.
Для начала познакомимся с булевыми переменными.
Задав переменной b значение true применим к ней оператор логического отрицания. И получим false
b = true
!b
Оператор логического И обозначается двойным знаком амперсанда.
true && false
А логическое ИЛИ обозначается двойной прямой чертой.
true || false
Также в Julia есть и другие логические операторы, такие как xor - исключающее или.
Битовые операторы
Битовые операторы позволяют напрямую работать с битовым представлением объекта в памяти компьютера.
Используя постфиксную запись выведем строку битов 8битного числа 2
x = Int8(2)
x |> bitstring
Давайте выполним побитовое отрицание.
Как видно, каждый бит поменял значение на противоположное.
~x |> bitstring
Используя,двойной знак меньше, мы можем указать, на какое количество позиций, мы можем сместить наше число влево. Давайте смести его влево 1 позицию.
x << 1 |> bitstring
x >> 1 |> bitstring
Битовое И
Аналогично побитовому отрицанию работает и побитовый оператор и. Он попарно сравнивает элементы и возвращает 1 только в том случае, когда на обеих позициях стоят единицы.
В отличие от логического оператора И, побитовое И записывается с использованием одного знака амперсанда.
x = Int8(2)
y = Int8(7)
println(bitstring(x))
println(bitstring(y))
x & y |> bitstring |> println
Операторы с присваиванием
+= -= *= /= \= ÷= %= ^= &= |= ⊻= >>>= >>= <<=
Также как и во многих других языках программирования в Julia есть операторы с присваиванием.
Запись x = x + 2 аналогично записи x += 2. То есть значение x переприсвоится, а не просто добавится двойка и выведется результат
x = 1
x + 2
x
x = x + 2
x += 2
Сравнение чисел
В Julia также довольно выразительно устроены операторы сравнения.
Оператор сравнения на равенство записывается при помощи двойного знака равно.
1 == 2
Из необычного синтаксиса в Julia можно отметить оператор приблизительно равно.
И как уже отмечалось раннее, многие операторы - это переменные (синонимы) функций, которые начинаются на is. Так, оператор равенства является синонимом isequal. А оператор приблизительного равенства - isapprox.
1. ≈ 1.000_000_01
isapprox(1,1.000_000_1)
Не углубляясь в то, как этот оператор работает, отметим лишь то, что в нём используется уже известная нам функция eps, которая показывала, с какой точностью Float может представлять число.
1000. * √eps(Float64)
1000. ≈ 1000.000_0149
Привычными, но при этом более выразительными являются, например, операторы не равно и оператор равно меньше.
1 != 2
1 ≠ 2
1 <= 2
1 ≤ 2
isnan(0/0)
isinf(1/0)
Функции над целыми числами
Перейдём теперь к работе над целыми числами. Для этих функций подходит только аргумент с целочисленным или рациональным значением.
Наименьшее общее кратное
lcm(3,7) # least common multiply
Наибольший общий делитель
gcd(16,28) # greatest common divisor
Факториал
factorial(5)
Биномиальные коэффициенты
binomial(6,3) # но может быть и не целым
Целочисленный квадратный корень
isqrt(10) # integer sqrt
Округления
Теперь рассмотрим округление чисел. С этой операцией приходится сталкиваться довольно часто, поэтому рассмотрим подробно, каждое из округлений.
Функция round округлит -1.6 до -2 ожидаемым образом. И -1.4 округлит до -1. А вот в случае с -1.5 она округлит до ближайшего чётного числа. В нашем случае это -2.
Функция floor округляет до нижнего - то есть ближе к -бесконечности. Т.е. -1.1 округлит до -2.
Функция ceil работает противоположно floor - округляя до верхнего (ближе к +бесконечности). Т.е. -1.9 она округлит до -1.
Функция же trunc округляет до ближайшего к 0 целого.
@show round(-1.5) # в случае .5 - к ближайшему чётному
@show floor(-1.5) # вниз -∞
@show ceil( -1.5) # вверх +∞
@show trunc(-1.5); # ближе к 0
@show round(4.5)
@show floor(4.5)
@show ceil( 4.5)
@show trunc(4.5);
Тригонометрия
Ещё одним часто используемым разделом является тригонометрия, поэтому в базовую библиотеку встроено так много тригонометрических функций.
sin(π/2)
sinpi принимает в качестве аргумента коэффициент умножения перед числом пи и передаёт это значение в функцию sin.
sinpi(1/2)
Градусы в радианы
sin(deg2rad(90))
Или же можно воспользоваться сразу функцией sind, которая в качестве аргументов принимает градусы, а не радианы
sind(90)
rad2deg(1)
Степени, логарифмы и корни
Закончим раздел работы с числами, рассмотрев степени, логарифмы и корни
cbrt(27)
hypot(3,4) # √(x²+y²)
Используя комплексную степень, получим тождество Эйлера, где
exp(π * im) + 1
log10(1000)
log(ℯ^7)
log2(100)