Mathematical Operations and Elementary Functions
Julia, tüm sayısal temel türleri arasında temel aritmetik ve bit düzeyindeki operatörlerin tam bir koleksiyonunu sunar ve ayrıca kapsamlı bir standart matematiksel fonksiyon koleksiyonunun taşınabilir, verimli uygulamalarını sağlar.
Arithmetic Operators
Aşağıdaki arithmetic operators tüm ilkel sayısal türlerde desteklenmektedir:
Expression | Name | Description |
---|---|---|
+x | unary plus | the identity operation |
-x | unary minus | maps values to their additive inverses |
x + y | binary plus | performs addition |
x - y | binary minus | performs subtraction |
x * y | times | performs multiplication |
x / y | divide | performs division |
x ÷ y | integer divide | x / y, truncated to an integer |
x \ y | inverse divide | equivalent to y / x |
x ^ y | power | raises x to the y th power |
x % y | remainder | equivalent to rem(x, y) |
Bir tanımlayıcı veya parantezden hemen önce yerleştirilen bir sayısal literal, örneğin 2x
veya 2(x + y)
, diğer ikili işlemlerden daha yüksek önceliğe sahip bir çarpma olarak değerlendirilir. Ayrıntılar için Numeric Literal Coefficients'e bakın.
Julia'nın terfi sistemi, argüman türlerinin karışımları üzerinde aritmetik işlemlerin "doğal olarak" ve otomatik olarak çalışmasını sağlar. Ayrıntılar için Conversion and Promotion'e bakın.
÷ işareti, REPL veya Julia IDE'sine \div<tab>
yazarak kolayca yazılabilir. Daha fazla bilgi için manual section on Unicode input'e bakın.
İşte aritmetik operatörler kullanan bazı basit örnekler:
julia> 1 + 2 + 3
6
julia> 1 - 2
-1
julia> 3*2/12
0.5
(Gelenek olarak, operatörlerin yanındaki diğer operatörlerden önce uygulanıyorsa, genellikle operatörleri daha sıkı bir şekilde aralıyoruz. Örneğin, ilk x
'in negatif alındığını ve ardından 2
'nin bu sonuca eklendiğini yansıtmak için genellikle -x + 2
şeklinde yazarız.)
Çarpma işlemlerinde false
, güçlü sıfır olarak işlev görür:
julia> NaN * false
0.0
julia> false * Inf
0.0
Bu, sıfır olduğu bilinen miktarlarda NaN
değerlerinin yayılmasını önlemek için faydalıdır. Motivasyon için Knuth (1992)'e bakın.
Boolean Operators
Aşağıdaki Boolean operators Bool
türleri desteklenmektedir:
Expression | Name |
---|---|
!x | negation |
x && y | short-circuiting and |
x || y | short-circuiting or |
Negasyon true
'yu false
'a ve tersini değiştirir. Kısa devre işlemleri bağlantılı sayfada açıklanmıştır.
Bool
bir tam sayı türüdür ve tüm olağan yükseltme kuralları ve sayısal operatörler de üzerinde tanımlıdır.
Bitwise Operators
Aşağıdaki bitwise operators tüm ilkel tam sayı türlerinde desteklenmektedir:
Expression | Name |
---|---|
~x | bitwise not |
x & y | bitwise and |
x | y | bitwise or |
x ⊻ y | bitwise xor (exclusive or) |
x ⊼ y | bitwise nand (not and) |
x ⊽ y | bitwise nor (not or) |
x >>> y | logical shift right |
x >> y | arithmetic shift right |
x << y | logical/arithmetic shift left |
İşte bit düzeyinde işleçlerle ilgili bazı örnekler:
julia> ~123
-124
julia> 123 & 234
106
julia> 123 | 234
251
julia> 123 ⊻ 234
145
julia> xor(123, 234)
145
julia> nand(123, 123)
-124
julia> 123 ⊼ 123
-124
julia> nor(123, 124)
-128
julia> 123 ⊽ 124
-128
julia> ~UInt32(123)
0xffffff84
julia> ~UInt8(123)
0x84
Updating operators
Herhangi bir ikili aritmetik ve bit düzeyindeki operatörün, işlemin sonucunu sol operandına geri atayan bir güncelleme versiyonu da vardır. İkili operatörün güncelleme versiyonu, operatörden hemen sonra bir =
yerleştirerek oluşturulur. Örneğin, x += 3
yazmak, x = x + 3
yazmakla eşdeğerdir:
julia> x = 1
1
julia> x += 3
4
julia> x
4
Tüm ikili aritmetik ve bit düzeyindeki operatörlerin güncellenmiş sürümleri şunlardır:
+= -= *= /= \= ÷= %= ^= &= |= ⊻= >>>= >>= <<=
Bir güncelleme operatörü, sol taraftaki değişkeni yeniden bağlar. Sonuç olarak, değişkenin türü değişebilir.
julia> x = 0x01; typeof(x)
UInt8
julia> x *= 2 # Same as x = x * 2
2
julia> typeof(x)
Int64
Vectorized "dot" operators
Her her ikili işlem için ^
, bir "nokta" işlemi .^
vardır ki bu otomatik olarak diziler üzerinde ^
eleman bazında gerçekleştirmek için tanımlanmıştır. Örneğin, [1, 2, 3] ^ 3
tanımlı değildir, çünkü bir (dörtgen olmayan) dizinin "küpleme" için standart matematiksel bir anlamı yoktur, ancak [1, 2, 3] .^ 3
eleman bazında (veya "vektörleştirilmiş") sonucu [1^3, 2^3, 3^3]
hesaplamak olarak tanımlanmıştır. Benzer şekilde, !
veya √
gibi tekil operatörler için, operatörü eleman bazında uygulayan bir .√
vardır.
julia> [1, 2, 3] .^ 3
3-element Vector{Int64}:
1
8
27
Daha spesifik olarak, a .^ b
ifadesi "dot" call (^).(a,b)
olarak yorumlanır; bu, broadcast işlemini gerçekleştirir: dizileri ve skalarları, aynı boyuttaki dizileri (işlemi eleman bazında gerçekleştirerek) ve hatta farklı şekillerdeki dizileri (örneğin, satır ve sütun vektörlerini bir matris üretmek için birleştirerek) birleştirebilir. Dahası, tüm vektörleştirilmiş "nokta çağrıları" gibi, bu "nokta operatörleri" birleştirilmektedir. Örneğin, bir dizi A
için 2 .* A.^2 .+ sin.(A)
(veya eşdeğer olarak @. 2A^2 + sin(A)
, @.
makrosunu kullanarak) hesapladığınızda, A
üzerinde tek bir döngü gerçekleştirir ve A
'nın her bir elemanı a
için 2a^2 + sin(a)
hesaplar. Özellikle, f.(g.(x))
gibi iç içe nokta çağrıları birleştirilir ve x .+ 3 .* x.^2
gibi "bitişik" ikili operatörler, iç içe nokta çağrıları (+).(x, (*).(3, (^).(x, 2)))
ile eşdeğerdir.
Furthermore, "dotted" updating operators like a .+= b
(or @. a += b
) are parsed as a .= a .+ b
, where .=
is a fused in-place assignment operation (see the dot syntax documentation).
Not edin nokta sözdizimi, kullanıcı tanımlı operatörler için de geçerlidir. Örneğin, ⊗(A, B) = kron(A, B)
tanımlarsanız, Kronecker çarpımları için A ⊗ B
şeklinde kullanışlı bir infiks sözdizimi elde edersiniz (kron
). Bu durumda, [A, B] .⊗ [C, D]
ifadesi, ek bir kodlama gerektirmeden [A⊗C, B⊗D]
hesaplayacaktır.
Nokta operatörlerini sayısal sabitlerle birleştirmek belirsiz olabilir. Örneğin, 1.+x
ifadesinin 1. + x
mi yoksa 1 .+ x
mi olduğu net değildir. Bu nedenle bu sözdizimi yasaklanmıştır ve bu tür durumlarda operatör etrafında boşluklar kullanılmalıdır.
Numeric Comparisons
Tüm temel sayısal türler için standart karşılaştırma işlemleri tanımlanmıştır:
Operator | Name |
---|---|
== | equality |
!= , ≠ | inequality |
< | less than |
<= , ≤ | less than or equal to |
> | greater than |
>= , ≥ | greater than or equal to |
İşte bazı basit örnekler:
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
Tam sayılar standart şekilde - bitlerin karşılaştırılmasıyla - karşılaştırılır. Kayan noktalı sayılar ise IEEE 754 standard'ye göre karşılaştırılır:
- Sonlu sayılar, olağan şekilde sıralanmıştır.
- Pozitif sıfır, negatif sıfırdan eşit ama daha büyük değildir.
Inf
, kendisiyle eşittir veNaN
hariç her şeyden büyüktür.-Inf
kendisiyle eşittir veNaN
hariç her şeyden küçüktür.NaN
kendisi de dahil olmak üzere hiçbir şeye eşit, daha az veya daha fazla değildir.
Son nokta potansiyel olarak şaşırtıcıdır ve bu nedenle dikkate değer:
julia> NaN == NaN
false
julia> NaN != NaN
true
julia> NaN < NaN
false
julia> NaN > NaN
false
ve ve baş ağrısına neden olabilir arrays:
julia> [1 NaN] == [1 NaN]
false
Julia, özel değerler için sayıları test etmek üzere ek fonksiyonlar sağlar; bu, hash anahtarı karşılaştırmaları gibi durumlarda faydalı olabilir:
Function | Tests if |
---|---|
isequal(x, y) | x and y are identical |
isfinite(x) | x is a finite number |
isinf(x) | x is infinite |
isnan(x) | x is not a number |
isequal
NaN
'leri birbirine eşit kabul eder:
julia> isequal(NaN, NaN)
true
julia> isequal([1 NaN], [1 NaN])
true
julia> isequal(NaN, NaN32)
true
isequal
işaretli sıfırları ayırt etmek için de kullanılabilir:
julia> -0.0 == 0.0
true
julia> isequal(-0.0, 0.0)
false
İmzalı tam sayılar, imzasız tam sayılar ve float'lar arasında karışık tür karşılaştırmaları zorlayıcı olabilir. Julia'nın bunları doğru bir şekilde yapmasını sağlamak için büyük bir özen gösterilmiştir.
Diğer türler için, isequal
varsayılan olarak ==
çağrısını yapar, bu nedenle kendi türleriniz için eşitliği tanımlamak istiyorsanız yalnızca bir 4d61726b646f776e2e436f64652822222c20223d3d2229_40726566
yöntemi eklemeniz gerekir. Kendi eşitlik fonksiyonunuzu tanımlarsanız, isequal(x,y)
ifadesinin hash(x) == hash(y)
anlamına gelmesini sağlamak için muhtemelen karşılık gelen bir hash
yöntemi tanımlamalısınız.
Chaining comparisons
Diğer dillerin çoğunun aksine, notable exception of Python ile karşılaştırmalar keyfi olarak zincirlenebilir:
julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
true
Karşılaştırmaları zincirleme, sayısal kodda genellikle oldukça kullanışlıdır. Zincirleme karşılaştırmalar, skalar karşılaştırmalar için &&
operatörünü ve eleman bazında karşılaştırmalar için &
operatörünü kullanır; bu, diziler üzerinde çalışmasına olanak tanır. Örneğin, 0 .< A .< 1
ifadesi, A
'nın karşılık gelen elemanlarının 0 ile 1 arasında olduğu yerlerde doğru olan bir boolean dizisi verir.
Zincirleme karşılaştırmaların değerlendirme davranışını not edin:
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
Orta ifade yalnızca bir kez değerlendirilir, oysa ifade v(1) < v(2) && v(2) <= v(3)
şeklinde yazılmış olsaydı iki kez değerlendirilirdi. Ancak, zincirleme karşılaştırmalardaki değerlendirme sırası belirsizdir. Zincirleme karşılaştırmalarda yan etkileri (örneğin, yazdırma gibi) kullanmamanız şiddetle önerilir. Yan etkiler gerekiyorsa, kısa devre &&
operatörü açıkça kullanılmalıdır (bkz. Short-Circuit Evaluation).
Elementary Functions
Julia, matematiksel fonksiyonlar ve operatörlerin kapsamlı bir koleksiyonunu sunar. Bu matematiksel işlemler, mantıklı tanımlara izin veren en geniş sayısal değer sınıfı üzerinde tanımlanmıştır; bu, mantıklı tanımların anlamlı olduğu yerlerde tam sayılar, kayan noktalı sayılar, rasyonel sayılar ve karmaşık sayıları içerir.
Ayrıca, bu fonksiyonlar (herhangi bir Julia fonksiyonu gibi) dot syntax f.(A)
ile dizilere ve diğer koleksiyonlara "vektörleştirilmiş" bir şekilde uygulanabilir; örneğin, sin.(A)
bir dizi A
'nın her bir elemanının sinüsünü hesaplayacaktır.
Operator Precedence and Associativity
Julia, aşağıdaki işlem sırasını ve birleştirme kurallarını, en yüksek öncelikten en düşük önceliğe doğru uygular:
Category | Operators | Associativity |
---|---|---|
Syntax | . followed by :: | Left |
Exponentiation | ^ | Right |
Unary | + - ! ~ ¬ √ ∛ ∜ ⋆ ± ∓ <: >: | Right[1] |
Bitshifts | << >> >>> | Left |
Fractions | // | Left |
Multiplication | * / % & \ ÷ | Left[2] |
Addition | + - | ⊻ | Left[2] |
Syntax | : .. | Left |
Syntax | |> | Left |
Syntax | <| | Right |
Comparisons | > < >= <= == === != !== <: | Non-associative |
Control flow | && followed by || followed by ? | Right |
Pair | => | Right |
Assignments | = += -= *= /= //= \= ^= ÷= %= |= &= ⊻= <<= >>= >>>= | Right |
Tam bir liste için her Julia operatörünün önceliği, bu dosyanın en üstüne bakın: src/julia-parser.scm
. Orada bazı operatörlerin Base
modülünde tanımlanmadığını, ancak standart kütüphaneler, paketler veya kullanıcı kodu tarafından tanımlanabileceğini unutmayın.
Verilen herhangi bir operatör için sayısal önceliği, daha yüksek sayıların önceliği aldığı yerleşik Base.operator_precedence
fonksiyonu aracılığıyla da bulabilirsiniz:
julia> Base.operator_precedence(:+), Base.operator_precedence(:*), Base.operator_precedence(:.)
(11, 12, 17)
julia> Base.operator_precedence(:sin), Base.operator_precedence(:+=), Base.operator_precedence(:(=)) # (Note the necessary parens on `:(=)`)
(0, 1, 1)
Bir operatör birleşimliliğini temsil eden bir sembol, yerleşik Base.operator_associativity
fonksiyonu çağrılarak da bulunabilir:
julia> Base.operator_associativity(:-), Base.operator_associativity(:+), Base.operator_associativity(:^)
(:left, :none, :right)
julia> Base.operator_associativity(:⊗), Base.operator_associativity(:sin), Base.operator_associativity(:→)
(:left, :none, :right)
Not edin ki :sin
gibi semboller öncelik 0
döndürür. Bu değer geçersiz operatörleri temsil eder ve en düşük öncelikli operatörleri değil. Benzer şekilde, bu tür operatörlere :none
birliktelik atanır.
Numeric literal coefficients, örneğin 2x
, diğer ikili işlemlerden daha yüksek önceliğe sahip çarpımlar olarak değerlendirilir, ^
hariç, burada yalnızca üslü işlem olarak daha yüksek önceliğe sahiptir.
julia> x = 3; 2x^2
18
julia> x = 3; 2^2x
64
Juxtapozisyon, üstelere etrafında aynı doğal asimetrik yapıya sahip olan bir unary operatör gibi ayrıştırılır: -x^y
ve 2x^y
, -(x^y)
ve 2(x^y)
olarak ayrıştırılırken, x^-y
ve x^2y
, x^(-y)
ve x^(2y)
olarak ayrıştırılır.
Numerical Conversions
Julia, üç farklı sayısal dönüştürme biçimini destekler; bu biçimler, kesin olmayan dönüşümlerin işlenişinde farklılık gösterir.
T(x)
veyaconvert(T, x)
notasyonu,x
'iT
türünde bir değere dönüştürür.- Eğer
T
bir kayan nokta türüyse, sonuç en yakın temsil edilebilir değer olup, bu pozitif veya negatif sonsuzluk olabilir. - Eğer
T
bir tam sayı türüyse,x
T
tarafından temsil edilemezse birInexactError
hatası oluşur.
- Eğer
x % T
bir tam sayıyıx
'in2^n
modülüne göreT
tam sayı türüne uygun bir değere dönüştürür; buradan
,T
'deki bit sayısını ifade eder. Diğer bir deyişle, ikili temsil, sığacak şekilde kesilir.Rounding functions bir
T
türünü isteğe bağlı bir argüman olarak alır. Örneğin,round(Int,x)
ifadesiInt(round(x))
için bir kısayoldur.
Aşağıdaki örnekler farklı biçimleri göstermektedir.
julia> Int8(127)
127
julia> Int8(128)
ERROR: InexactError: trunc(Int8, 128)
Stacktrace:
[...]
julia> Int8(127.0)
127
julia> Int8(3.14)
ERROR: InexactError: Int8(3.14)
Stacktrace:
[...]
julia> Int8(128.0)
ERROR: InexactError: Int8(128.0)
Stacktrace:
[...]
julia> 127 % Int8
127
julia> 128 % Int8
-128
julia> round(Int8,127.4)
127
julia> round(Int8,127.6)
ERROR: InexactError: Int8(128.0)
Stacktrace:
[...]
Conversion and Promotion için kendi dönüşümlerinizi ve promosyonlarınızı nasıl tanımlayacağınızı görün.
Rounding functions
Function | Description | Return type |
---|---|---|
round(x) | round x to the nearest integer | typeof(x) |
round(T, x) | round x to the nearest integer | T |
floor(x) | round x towards -Inf | typeof(x) |
floor(T, x) | round x towards -Inf | T |
ceil(x) | round x towards +Inf | typeof(x) |
ceil(T, x) | round x towards +Inf | T |
trunc(x) | round x towards zero | typeof(x) |
trunc(T, x) | round x towards zero | T |
Division functions
Function | Description |
---|---|
div(x, y) , x÷y | truncated division; quotient rounded towards zero |
fld(x, y) | floored division; quotient rounded towards -Inf |
cld(x, y) | ceiling division; quotient rounded towards +Inf |
rem(x, y) , x%y | remainder; satisfies x == div(x, y)*y + rem(x, y) ; sign matches x |
mod(x, y) | modulus; satisfies x == fld(x, y)*y + mod(x, y) ; sign matches y |
mod1(x, y) | mod with offset 1; returns r∈(0, y] for y>0 or r∈[y, 0) for y<0 , where mod(r, y) == mod(x, y) |
mod2pi(x) | modulus with respect to 2pi; 0 <= mod2pi(x) < 2pi |
divrem(x, y) | returns (div(x, y),rem(x, y)) |
fldmod(x, y) | returns (fld(x, y), mod(x, y)) |
gcd(x, y...) | greatest positive common divisor of x , y ,... |
lcm(x, y...) | least positive common multiple of x , y ,... |
Sign and absolute value functions
Function | Description |
---|---|
abs(x) | a positive value with the magnitude of x |
abs2(x) | the squared magnitude of x |
sign(x) | indicates the sign of x , returning -1, 0, or +1 |
signbit(x) | indicates whether the sign bit is on (true) or off (false) |
copysign(x, y) | a value with the magnitude of x and the sign of y |
flipsign(x, y) | a value with the magnitude of x and the sign of x*y |
Powers, logs and roots
Function | Description |
---|---|
sqrt(x) , √x | square root of x |
cbrt(x) , ∛x | cube root of x |
hypot(x, y) | hypotenuse of right-angled triangle with other sides of length x and y |
exp(x) | natural exponential function at x |
expm1(x) | accurate exp(x) - 1 for x near zero |
ldexp(x, n) | x * 2^n computed efficiently for integer values of n |
log(x) | natural logarithm of x |
log(b, x) | base b logarithm of x |
log2(x) | base 2 logarithm of x |
log10(x) | base 10 logarithm of x |
log1p(x) | accurate log(1 + x) for x near zero |
exponent(x) | binary exponent of x |
significand(x) | binary significand (a.k.a. mantissa) of a floating-point number x |
hypot
, expm1
, ve log1p
gibi fonksiyonların neden gerekli ve faydalı olduğuna dair bir genel bakış için John D. Cook'un bu konudaki mükemmel iki blog yazısına bakın: expm1, log1p, erfc ve hypot.
Trigonometric and hyperbolic functions
Tüm standart trigonometrik ve hiperbolik fonksiyonlar da tanımlanmıştır:
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
Bunlar, atan
geleneksel atan2
fonksiyonuna karşılık gelen iki argümanı da kabul eden tek argümanlı fonksiyonlardır.
Ayrıca, sinpi(x)
ve cospi(x)
daha doğru hesaplamalar için sin(pi * x)
ve cos(pi * x)
ile sırasıyla sağlanmıştır.
Derece yerine radyan kullanarak trigonometrik fonksiyonları hesaplamak için, fonksiyonun sonuna d
ekleyin. Örneğin, sind(x)
ifadesi, x
'in derece cinsinden belirtildiği durumda x
'in sinüsünü hesaplar. Derece varyantlarına sahip trigonometrik fonksiyonların tam listesi şudur:
sind cosd tand cotd secd cscd
asind acosd atand acotd asecd acscd
Special functions
Birçok diğer özel matematiksel fonksiyon, SpecialFunctions.jl paketinde sağlanmaktadır.
- 1The unary operators
+
and-
require explicit parentheses around their argument to disambiguate them from the operator++
, etc. Other compositions of unary operators are parsed with right-associativity, e. g.,√√-a
as√(√(-a))
. - 2The operators
+
,++
and*
are non-associative.a + b + c
is parsed as+(a, b, c)
not+(+(a, b), c)
. However, the fallback methods for+(a, b, c, d...)
and*(a, b, c, d...)
both default to left-associative evaluation.