Spec-Zone.ru › Julia 0.5

Математические операции и элементарные функции

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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API