Математические операции и элементарные функции
Julia предоставляет полный набор основных арифметических и побитовых операторов для всех своих числовых примитивных типов, а также портативные и эффективные реализации комплексного набора стандартных математических функций.
Арифметические операторы
Следующие арифметические операторы поддерживаются для всех примитивных числовых типов:
| Выражение | Название | Описание |
|---|---|---|
+x | унарный плюс | идентичная операция |
-x | унарный минус | отображает значения на их аддитивные обратные |
x + y | бинарный плюс | выполняет сложение |
x - y | бинарный минус | выполняет вычитание |
x * y | умножить | выполняет умножение |
x / y | разделить | выполняет деление |
x \ y | обратное деление | эквивалентно y / x
|
x ^ y | возведение в степень | возводит x в y-ю степень |
x % y | остаток | эквивалентно rem(x,y)
|
а также отрицание для Bool типов:
| Выражение | Название | Описание |
|---|---|---|
!x | отрицание | меняет true на false и наоборот |
Система повышения типа Julia делает арифметические операции над смешанными типами аргументов «работать» естественным и автоматическим образом. Подробнее о системе повышения типа см. в разделе Преобразование и повышение.
Вот несколько простых примеров использования арифметических операторов:
julia> 1 + 2 + 3 6 julia> 1 - 2 -1 julia> 3*2/12 0.5
(По соглашению, мы склонны размещать операторы более плотно, если они применяются до других близлежащих операторов. Например, мы обычно пишем -x + 2 для отражения того, что сначала x отрицается, а затем 2 добавляется к этому результату.)
Побитовые операторы
Следующие побитовые операторы поддерживаются для всех примитивных целочисленных типов:
| Выражение | Название |
|---|---|
~x | побитовое отрицание |
x & y | побитовое И |
x | y | побитовое ИЛИ |
x $ y | побитовое исключающее ИЛИ |
x >>> y | логический сдвиг вправо |
x >> y | арифметический сдвиг вправо |
x << y | логический/арифметический сдвиг влево |
Вот несколько примеров с побитовыми операторами:
julia> ~123 -124 julia> 123 & 234 106 julia> 123 | 234 251 julia> 123 $ 234 145 julia> ~UInt32(123) 0xffffff84 julia> ~UInt8(123) 0x84
Операторы обновления
Каждый бинарный арифметический и побитовый оператор также имеет версию обновления, которая присваивает результат операции обратно в свой левый операнд. Обновленная версия бинарного оператора образуется путем размещения = сразу после оператора. Например, запись x += 3 эквивалентна записи x = x + 3:
julia> x = 1 1 julia> x += 3 4 julia> x 4
Обновленные версии всех бинарных арифметических и побитовых операторов:
+= -= *= /= \= ÷= %= ^= &= |= $= >>>= >>= <<=
Примечание
Оператор обновления перепривязывает переменную слева. В результате тип переменной может измениться.
julia> x = 0x01; typeof(x) UInt8 julia> x *= 2 #Same as x = x * 2 2 julia> isa(x, Int) true
Числовые сравнения
Стандартные операции сравнения определены для всех примитивных числовых типов:
| Оператор | Название |
|---|---|
== | равенство |
!= ≠
| неравенство |
< | меньше |
<= ≤
| меньше или равно |
> | больше |
>= ≥
| больше или равно |
Вот несколько простых примеров:
julia> 1 == 1 true julia> 1 == 2 false julia> 1 != 2 true julia> 1 == 1.0 true julia> 1 < 2 true julia> 1.0 > 3 false julia> 1 >= 1.0 true julia> -1 <= 1 true julia> -1 <= -1 true julia> -1 <= -2 false julia> 3 < -0.5 false
Целые числа сравниваются стандартным способом — путем сравнения битов. Вещественные числа сравниваются в соответствии со стандартом IEEE 754:
- Конечные числа упорядочиваются обычным образом.
- Положительный ноль равен, но не больше отрицательного нуля.
-
Infравен самому себе и больше всего остального, кромеNaN. -
-Infравен самому себе и меньше всего остального, кромеNaN. -
NaNне равен, не меньше и не больше ничего, включая себя.
Последний пункт потенциально неожиданный и поэтому заслуживает внимания:
julia> NaN == NaN false julia> NaN != NaN true julia> NaN < NaN false julia> NaN > NaN false
и может вызвать особые трудности с Массивами:
julia> [1 NaN] == [1 NaN] false
Julia предоставляет дополнительные функции для проверки чисел на специальные значения, что может быть полезно в ситуациях, таких как сравнения ключей хеширования:
| Функция | Проверяет, является ли |
|---|---|
isequal(x, y) |
x и y идентичны |
isfinite(x) |
x является конечным числом |
isinf(x) |
x является бесконечным |
isnan(x) |
x не является числом |
isequal() считает NaN равными друг другу:
julia> isequal(NaN,NaN) true julia> isequal([1 NaN], [1 NaN]) true julia> isequal(NaN,NaN32) true
isequal() также может использоваться для различения знакомых нулей:
julia> -0.0 == 0.0 true julia> isequal(-0.0, 0.0) false
Сравнения смешанных типов между знаковыми целыми числами, беззнаковыми целыми числами и плавающей точкой могут быть сложными. Были предприняты значительные усилия для обеспечения правильности их работы в Julia.
Для других типов isequal() по умолчанию вызывает ==(), поэтому если вы хотите определить равенство для своих типов, то вам нужно добавить метод ==(). Если вы определите свою собственную функцию равенства, то, вероятно, вы должны определить соответствующий метод hash(), чтобы гарантировать, что isequal(x,y) подразумевает hash(x) == hash(y).
Цепочки сравнений
В отличие от большинства языков, за исключением Python, сравнения могут быть произвольно сцеплены:
julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5 true
Цепочки сравнений часто бывают удобны в численном коде. Цепочки сравнений используют оператор && для скалярных сравнений и оператор & для поэлементных сравнений, что позволяет им работать с массивами. Например, 0 .< A .< 1 дает булевый массив, чьи элементы равны true там, где соответствующие элементы A находятся между 0 и 1.
Оператор .< предназначен для объектов массивов; операция A .< B допустима только если A и B имеют одинаковые размеры. Оператор возвращает массив с логическими значениями и теми же размерами, что и A и B. Такие операторы называются элементными; Julia предоставляет набор элементных операторов: .*, .+ и т.д. Некоторые элементные операторы могут принимать скалярный операнд, как в примере 0 .< A .< 1 в предыдущем абзаце. Эта запись означает, что скалярный операнд должен быть продублирован для каждого элемента массива.
Обратите внимание на поведение вычисления цепочки сравнений:
julia> v(x) = (println(x); x) v (generic function with 1 method) julia> v(1) < v(2) <= v(3) 2 1 3 true julia> v(1) > v(2) <= v(3) 2 1 false
Среднее выражение вычисляется только один раз, а не дважды, как если бы выражение было записано как v(1) < v(2) && v(2) <= v(3). Однако порядок вычислений в цепочке сравнений не определён. Сильно рекомендуется не использовать выражения со побочными эффектами (такие как вывод на печать) в цепочках сравнений. Если требуются побочные эффекты, следует явно использовать оператор короткого замыкания && (см. Вычисление с коротким замыканием).
Приоритет операторов
Julia применяет следующий порядок операций, от наивысшего приоритета к наименьшему:
| Категория | Операторы |
|---|---|
| Синтаксис |
. и ::
|
| Возведение в степень |
^ и его эквивалент для элементов .^
|
| Дроби |
// и .//
|
| Умножение |
* / % & \ и .* ./ .% .\
|
| Сдвиги битов |
<< >> >>> и .<< .>> .>>>
|
| Сложение |
+ - | $ и .+ .-
|
| Синтаксис |
: .. и |>
|
| Сравнения |
> < >= <= == === != !== <: и .> .< .>= .<= .== .!=
|
| Управление потоком |
&& и || и ?
|
| Присваивания |
= += -= *= /= //= \= ^= ÷= %= |= &= $= <<= >>= >>>= и .+= .-= .*= ./= .//= .\= .^= .÷= .%=
|
Элементарные функции
Julia предоставляет обширный набор математических функций и операторов. Эти математические операции определены для широкого класса числовых значений, включая целые числа, числа с плавающей точкой, рациональные числа и комплексные числа, где такие определения имеют смысл.
Кроме того, эти функции (как и любая функция Julia) могут применяться «векторно» к массивам и другим коллекциям с синтаксисом f.(A), например, sin.(A) вычислит элементную синус каждой позиции массива A. См. Точка синтаксиса для векторизации функций:
Числовые преобразования
Julia поддерживает три формы числовых преобразований, которые различаются по обработке неточных преобразований.
- Запись
T(x)илиconvert(T,x)преобразуетxв значение типаT.- Если
T— тип с плавающей точкой, результат — ближайшее представимое значение, которое может быть положительной или отрицательной бесконечностью. - Если
T— целочисленный тип, возникаетInexactErrorисключение, еслиxне представимо типомT.
- Если
-
x % Tпреобразует целое числоxв значение целочисленного типаTконгруэнтноеxпо модулю2^n, гдеn— количество бит вT. - Функции округления принимают тип
Tв качестве необязательного аргумента. Например,round(Int,x)— сокращение дляInt(round(x)).
Следующие примеры показывают различные формы.
julia> Int8(127)
127
julia> Int8(128)
ERROR: InexactError()
in Int8(::Int64) at ./sysimg.jl:53
...
julia> Int8(127.0)
127
julia> Int8(3.14)
ERROR: InexactError()
in Int8(::Float64) at ./sysimg.jl:53
...
julia> Int8(128.0)
ERROR: InexactError()
in Int8(::Float64) at ./sysimg.jl:53
...
julia> 127 % Int8
127
julia> 128 % Int8
-128
julia> round(Int8,127.4)
127
julia> round(Int8,127.6)
ERROR: InexactError()
in trunc(::Type{Int8}, ::Float64) at ./float.jl:458
in round(::Type{Int8}, ::Float64) at ./float.jl:211
...
См. Преобразование и продвижение, чтобы узнать, как определять собственные преобразования и продвижения.
Функции округления
| Функция | Описание | Тип возвращаемого значения |
|---|---|---|
round(x) | округлить x до ближайшего целого числа | typeof(x) |
round(T, x) | округлить x до ближайшего целого числа | T |
floor(x) | округлить x к -Inf
| typeof(x) |
floor(T, x) | округлить x к -Inf
| T |
ceil(x) | округлить x к +Inf
| typeof(x) |
ceil(T, x) | округлить x к +Inf
| T |
trunc(x) | округлить x к нулю | typeof(x) |
trunc(T, x) | округлить x к нулю | T |
Функции деления
| Функция | Описание |
|---|---|
div(x,y) | целочисленное деление; частное округляется к нулю |
fld(x,y) | деление с округлением вниз; частное округляется к -Inf
|
cld(x,y) | деление с округлением вверх; частное округляется к +Inf
|
rem(x,y) | остаток; удовлетворяет x == div(x,y)*y + rem(x,y); знак совпадает со знаком x
|
mod(x,y) | модуль; удовлетворяет x == fld(x,y)*y + mod(x,y); знак совпадает со знаком y
|
mod1(x,y) |
mod() со смещением 1; возвращает r∈(0,y] для y>0 или r∈[y,0) для y<0, где mod(r, y) == mod(x, y)
|
mod2pi(x) | модуль относительно 2π; 0 <= mod2pi(x) < 2pi
|
divrem(x,y) | возвращает (div(x,y),rem(x,y))
|
fldmod(x,y) | возвращает (fld(x,y),mod(x,y))
|
gcd(x,y...) | наибольший общий делитель x, y,... |
lcm(x,y...) | наименьшее общее кратное x, y,... |
Функции знака и абсолютного значения
| Функция | Описание |
|---|---|
abs(x) | положительное значение с величиной x
|
abs2(x) | квадрат величины x
|
sign(x) | указывает знак x, возвращая -1, 0 или +1 |
signbit(x) | указывает, включен ли бит знака (true) или выключен (false) |
copysign(x,y) | значение с величиной x и знаком y
|
flipsign(x,y) | значение с величиной x и знаком x*y
|
Возведение в степень, логарифмы и корни
| Функция | Описание |
|---|---|
sqrt(x) √x
| квадратный корень из x
|
cbrt(x) ∛x
| кубический корень из x
|
hypot(x,y) | гипотенуза прямоугольного треугольника с другими сторонами длиной x и y
|
exp(x) | натуральная экспоненциальная функция в x
|
expm1(x) | точное значение exp(x)-1 для x близких к нулю |
ldexp(x,n) |
x*2^n, вычисляется эффективно для целочисленных значений n
|
log(x) | натуральный логарифм x
|
log(b,x) | логарифм по основанию b от x
|
log2(x) | логарифм по основанию 2 от x
|
log10(x) | логарифм по основанию 10 от x
|
log1p(x) | точное значение log(1+x) для x близких к нулю |
exponent(x) | бинарный показатель степени x
|
significand(x) | бинарная мантисса (также называется мантиссой) числа с плавающей точкой x
|
Для обзора того, почему функции, такие как hypot(), expm1() и log1p() необходимы и полезны, см. отличные посты Джона Д. Кука в блоге на эту тему: expm1, log1p, erfc и hypot.
Тригонометрические и гиперболические функции
Определены также все стандартные тригонометрические и гиперболические функции:
sin cos tan cot sec csc sinh cosh tanh coth sech csch asin acos atan acot asec acsc asinh acosh atanh acoth asech acsch sinc cosc atan2
Все они являются функциями с одним аргументом, за исключением atan2, которая возвращает угол в радианах между осью x и точкой, заданной ее аргументами, интерпретированными как координаты x и y.
Кроме того, sinpi(x) и cospi(x) предоставляются для более точных вычислений sin(pi*x) и cos(pi*x) соответственно.
Для вычисления тригонометрических функций в градусах вместо радиан, добавьте суффикс d. Например, sind(x) вычисляет синус x где x указано в градусах. Полный список тригонометрических функций с вариантами в градусах:
sind cosd tand cotd secd cscd asind acosd atand acotd asecd acscd
Специальные функции
| Функция | Описание |
|---|---|
erf(x) |
функция ошибок в x
|
erfc(x) | дополнительная функция ошибок, т.е. точная версия 1-erf(x) для больших x
|
erfinv(x) | обратная функция к erf()
|
erfcinv(x) | обратная функция к erfc()
|
erfi(x) | мнимая функция ошибок, определённая как -im * erf(x * im), где im — мнимая единица |
erfcx(x) | масштабированная дополнительная функция ошибок, т.е. точная exp(x^2) * erfc(x) для больших x
|
dawson(x) | масштабированная мнимая функция ошибок, также известная как функция Досона, т.е. точная exp(-x^2) * erfi(x) * sqrt(pi) / 2 для больших x
|
gamma(x) |
гамма-функция в x
|
lgamma(x) | точная log(gamma(x)) для больших x
|
lfact(x) | точная log(factorial(x)) для больших x; совпадает с lgamma(x+1) для x > 1, в противном случае — ноль |
digamma(x) |
функция дигаммы (т.е. производная lgamma()) в x
|
beta(x,y) |
бета-функция в x,y
|
lbeta(x,y) | точная log(beta(x,y)) для больших x или y
|
eta(x) |
функция Дирихле эта в x
|
zeta(x) |
функция Римана дзета в x
|
airy(z), airyai(z), airy(0,z)
|
функция Эйри Ai в z
|
airyprime(z), airyaiprime(z), airy(1,z)
| производная функции Эйри Ai в z
|
airybi(z), airy(2,z)
|
функция Эйри Bi в z
|
airybiprime(z), airy(3,z)
| производная функции Эйри Bi в z
|
airyx(z), airyx(k,z)
| масштабированная функция Эйри AI и k-е производные в z
|
besselj(nu,z) |
функция Бесселя первого рода порядка nu в z
|
besselj0(z) | besselj(0,z) |
besselj1(z) | besselj(1,z) |
besseljx(nu,z) | масштабированная функция Бесселя первого рода порядка nu в z
|
bessely(nu,z) |
функция Бесселя второго рода порядка nu в z
|
bessely0(z) | bessely(0,z) |
bessely1(z) | bessely(1,z) |
besselyx(nu,z) | масштабированная функция Бесселя второго рода порядка nu в z
|
besselh(nu,k,z) |
функция Бесселя третьего рода (также функция Ханкеля) порядка nu в z; k должно быть либо 1, либо 2
|
hankelh1(nu,z) | besselh(nu, 1, z) |
hankelh1x(nu,z) | масштабированная besselh(nu, 1, z)
|
hankelh2(nu,z) | besselh(nu, 2, z) |
hankelh2x(nu,z) | масштабированная besselh(nu, 2, z)
|
besseli(nu,z) | модифицированная функция Бесселя первого рода порядка nu в z
|
besselix(nu,z) | масштабированная модифицированная функция Бесселя первого рода порядка nu в z
|
besselk(nu,z) | модифицированная функция Бесселя второго рода порядка nu в z
|
besselkx(nu,z) | масштабированная модифицированная функция Бесселя второго рода порядка nu в z
|
© 2009–2016 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/release-0.5/manual/mathematical-operations/