Числа и арифметика

Базовые числовые типы Julia и арифметические операции, с упором на отличия от Python.

Числовой тип определяет, как число хранится в памяти и как над ним выполняются операции. В Julia типы чисел явные и влияют на скорость.

Целые и дробные

По умолчанию целочисленный литерал имеет тип Int64 (на 64-битных системах), а число с точкой — Float64. Узнать тип значения можно функцией typeof:

a = 42
b = 3.14
println(typeof(a))
println(typeof(b))

Вывод:

Int64
Float64

Арифметические операторы

ОператорДействиеПример
+ - * /базовая арифметика7 / 2 == 3.5
÷ или divцелочисленное деление7 ÷ 2 == 3
%остаток7 % 2 == 1
^возведение в степень2 ^ 10 == 1024

Важное отличие от Python: оператор / в Julia всегда даёт Float64, даже если делится нацело. 4 / 2 вернёт 2.0, а не 2. Для целочисленного деления используйте ÷ (набирается \div + Tab) или функцию div.

Умножение без знака

Julia позволяет писать коэффициент перед переменной без знака умножения — как в математике:

x = 5
y = 2x + 1     # эквивалентно 2*x + 1
println(y)

Вывод:

11

Переполнение целых

Это критичное отличие от Python. В Python целые числа неограниченны и растут «бесконечно». В Julia Int64 имеет фиксированный размер, и при переполнении значение «заворачивается» по кругу:

println(typemax(Int64))
println(typemax(Int64) + 1)

Вывод:

9223372036854775807
-9223372036854775808

Если нужны действительно большие числа, используйте тип произвольной точности BigInt (об этом — в уроке про специальные числа).

Сравнения

Сравнения возвращают Bool и могут соединяться в цепочку, как в математике: 0 < x < 10 означает «x больше 0 И меньше 10».

x = 5
println(0 < x < 10)
println(3 <= x && x != 7)

Вывод:

true
true

Как работает под капотом

Тип Int64 хранится в 64 битах и обрабатывается процессором за одну инструкцию — это и даёт скорость. Цена — фиксированный диапазон и возможное переполнение. Float64 следует стандарту IEEE 754, как в большинстве языков, поэтому здесь действуют обычные подводные камни вещественной арифметики (например, 0.1 + 0.2 != 0.3).

Частые ошибки

Самая частая ловушка для пришедших из Python — забыть про переполнение Int64 в циклах с факториалами или степенями. Если результат подозрительно стал отрицательным или маленьким, скорее всего, произошло переполнение — переходите на BigInt.

Итоги

  • Целые по умолчанию — Int64, дробные — Float64.
  • / всегда даёт Float; для целочисленного деления есть ÷ и div.
  • Можно писать 2x вместо 2*x.
  • Int64 переполняется (в отличие от Python) — для больших чисел нужен BigInt.
  • Сравнения соединяются в цепочки: 0 < x < 10.
Проверьте себя
1. Что вернёт выражение 4 / 2 в Julia?
A2 (Int64)
B2.0 (Float64)
CОшибку, нужно использовать div
D"2" (строку)
2. Чем поведение Int64 в Julia отличается от целых чисел в Python?
AВ Julia целые не поддерживают сложение
BInt64 имеет фиксированный размер и может переполниться, тогда как Python-целые неограниченны
CВ Julia нет целых чисел
DInt64 всегда хранит только положительные числа