Mathematical Operations and Elementary Functions
تقدم جوليا مجموعة كاملة من العمليات الحسابية الأساسية وعمليات بت على جميع أنواعها الأولية الرقمية، بالإضافة إلى توفير تنفيذات محمولة وفعالة لمجموعة شاملة من الدوال الرياضية القياسية.
Arithmetic Operators
النص التالي arithmetic operators مدعوم على جميع الأنواع الرقمية البدائية:
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) |
يتم اعتبار الرقم الأدبي الموضوع مباشرةً قبل معرف أو أقواس، مثل 2x
أو 2(x + y)
، كعملية ضرب، باستثناء أنه يتمتع بأولوية أعلى من العمليات الثنائية الأخرى. انظر Numeric Literal Coefficients لمزيد من التفاصيل.
نظام الترقية في جوليا يجعل العمليات الحسابية على خلطات من أنواع المعاملات "تعمل بشكل طبيعي" و"تلقائي". انظر Conversion and Promotion لمزيد من التفاصيل حول نظام الترقية.
يمكن كتابة علامة القسمة ÷ بسهولة عن طريق كتابة \div<tab>
في REPL أو IDE الخاص بـ Julia. راجع manual section on Unicode input لمزيد من المعلومات.
إليك بعض الأمثلة البسيطة باستخدام عوامل الحساب:
julia> 1 + 2 + 3
6
julia> 1 - 2
-1
julia> 3*2/12
0.5
(بالممارسة، نميل إلى تقليل المسافة بين العوامل إذا تم تطبيقها قبل عوامل قريبة أخرى. على سبيل المثال، عادةً ما نكتب -x + 2
لتعكس أن x
يتم نفيه أولاً، ثم يتم إضافة 2
إلى تلك النتيجة.)
عند استخدامه في الضرب، يعمل false
كـ صفر قوي:
julia> NaN * false
0.0
julia> false * Inf
0.0
هذا مفيد لمنع انتشار قيم NaN
في الكميات المعروفة بأنها صفر. انظر Knuth (1992) للحصول على الدافع.
Boolean Operators
النص التالي Boolean operators مدعوم على Bool
الأنواع:
Expression | Name |
---|---|
!x | negation |
x && y | short-circuiting and |
x || y | short-circuiting or |
تغير النفي true
إلى false
والعكس صحيح. يتم شرح عمليات التوقف القصير على الصفحة المرتبطة.
لاحظ أن Bool
هو نوع صحيح وأن جميع قواعد الترقية المعتادة وعوامل التشغيل الرقمية محددة أيضًا عليه.
Bitwise Operators
النص التالي bitwise operators مدعوم على جميع أنواع الأعداد الصحيحة البدائية:
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 |
إليك بعض الأمثلة مع عوامل التشغيل البتية:
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
كل عملية حسابية ثنائية وعامل بت يمكن أن يكون له إصدار تحديثي يقوم بإسناد نتيجة العملية مرة أخرى إلى المعامل الأيسر. يتم تشكيل الإصدار التحديثي من العامل الثنائي عن طريق وضع =
مباشرة بعد العامل. على سبيل المثال، كتابة 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> typeof(x)
Int64
Vectorized "dot" operators
لكل عملية ثنائية مثل ^
، هناك عملية "نقطة" مقابلة .^
يتم تعريفها بشكل تلقائي لتنفيذ ^
عنصرًا بعنصر على المصفوفات. على سبيل المثال، [1, 2, 3] ^ 3
غير معرف، حيث لا يوجد معنى رياضي قياسي لـ "تربيع" مصفوفة (غير مربعة)، ولكن [1, 2, 3] .^ 3
معرف على أنه حساب النتيجة العنصرية (أو "المتجهة") [1^3, 2^3, 3^3]
. بالمثل، بالنسبة للمشغلين الأحاديين مثل !
أو √
، هناك .√
المقابلة التي تطبق المشغل عنصرًا بعنصر.
julia> [1, 2, 3] .^ 3
3-element Vector{Int64}:
1
8
27
بشكل أكثر تحديدًا، يتم تحليل a .^ b
كـ "dot" call (^).(a,b)
، والذي ينفذ عملية broadcast: يمكنه دمج المصفوفات والسكالار، ومصفوفات بنفس الحجم (ينفذ العملية عنصرًا بعنصر)، وحتى مصفوفات بأشكال مختلفة (مثل دمج المتجهات الصفية والعمودية لإنتاج مصفوفة). علاوة على ذلك، مثل جميع "استدعاءات النقطة" الموجهة، فإن هذه "المشغلين النقطة" مُدمجة. على سبيل المثال، إذا قمت بحساب 2 .* A.^2 .+ sin.(A)
(أو ما يعادلها @. 2A^2 + sin(A)
، باستخدام الماكرو @.
لمصفوفة A
، فإنه ينفذ حلقة واحدة على A
، محسوبًا 2a^2 + sin(a)
لكل عنصر a
من A
. بشكل خاص، يتم دمج استدعاءات النقطة المتداخلة مثل f.(g.(x))
، والمشغلين الثنائيين "المجاورين" مثل x .+ 3 .* x.^2
تعادل استدعاءات النقطة المتداخلة (+).(x, (*).(3, (^).(x, 2)))
.
علاوة على ذلك، يتم تحليل مشغلات التحديث "المتقطعة" مثل a .+= b
(أو @. a += b
) على أنها a .= a .+ b
، حيث أن .=
هو عملية تعيين في المكان مدمجة (انظر dot syntax documentation).
لاحظ أن بناء الجملة النقطي ينطبق أيضًا على المشغلين المعرفين من قبل المستخدم. على سبيل المثال، إذا قمت بتعريف ⊗(A, B) = kron(A, B)
لتوفير بناء جملة infix مريح A ⊗ B
لمنتجات كرونكر (kron
)، فإن [A, B] .⊗ [C, D]
ستحسب [A⊗C, B⊗D]
دون أي ترميز إضافي.
يمكن أن يكون دمج عوامل النقطة مع الأعداد الرقمية غامضًا. على سبيل المثال، ليس من الواضح ما إذا كانت 1.+x
تعني 1. + x
أو 1 .+ x
. لذلك، فإن هذه الصياغة غير مسموح بها، ويجب استخدام المسافات حول العامل في مثل هذه الحالات.
Numeric Comparisons
تُعرَف عمليات المقارنة القياسية لجميع الأنواع الرقمية البدائية:
Operator | Name |
---|---|
== | equality |
!= , ≠ | inequality |
< | less than |
<= , ≤ | less than or equal to |
> | greater than |
>= , ≥ | greater than or equal to |
إليك بعض الأمثلة البسيطة:
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 standard:
- الأعداد المنتهية مرتبة بالطريقة المعتادة.
- الصفر الإيجابي يساوي ولكن لا يتجاوز الصفر السلبي.
Inf
يساوي نفسه وأكبر من كل شيء آخر باستثناءNaN
.-Inf
يساوي نفسه وأقل من كل شيء آخر باستثناءNaN
.NaN
لا يساوي، ولا يقل عن، ولا يزيد عن أي شيء، بما في ذلك نفسه.
النقطة الأخيرة قد تكون مفاجئة وبالتالي تستحق الذكر:
julia> NaN == NaN
false
julia> NaN != NaN
true
julia> NaN < NaN
false
julia> NaN > NaN
false
ويمكن أن تسبب الصداع عند العمل مع arrays:
julia> [1 NaN] == [1 NaN]
false
تقدم جوليا وظائف إضافية لاختبار الأرقام للقيم الخاصة، والتي يمكن أن تكون مفيدة في حالات مثل مقارنات مفاتيح التجزئة:
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
s متساوية مع بعضها البعض:
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
يمكن أن تكون المقارنات المختلطة بين الأعداد الصحيحة الموقعة، والأعداد الصحيحة غير الموقعة، والأعداد العشرية معقدة. تم بذل الكثير من الجهد لضمان أن تقوم جوليا بذلك بشكل صحيح.
بالنسبة لأنواع أخرى، isequal
بشكل افتراضي يستدعي ==
، لذا إذا كنت تريد تعريف المساواة لأنواعك الخاصة، فإنك تحتاج فقط إلى إضافة طريقة 4d61726b646f776e2e436f64652822222c20223d3d2229_40726566
. إذا قمت بتعريف دالة المساواة الخاصة بك، يجب عليك على الأرجح تعريف طريقة hash
المقابلة لضمان أن isequal(x,y)
تعني hash(x) == hash(y)
.
Chaining comparisons
على عكس معظم اللغات، مع notable exception of Python، يمكن ربط المقارنات بشكل تعسفي:
julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
true
تعتبر المقارنات المتسلسلة مريحة للغاية في الشيفرة العددية. تستخدم المقارنات المتسلسلة عامل &&
للمقارنات الاسكالية، وعامل &
للمقارنات العنصرية، مما يسمح لها بالعمل على المصفوفات. على سبيل المثال، 0 .< A .< 1
يعطي مصفوفة من القيم المنطقية حيث تكون المدخلات صحيحة حيث تكون العناصر المقابلة لـ A
بين 0 و 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)
. ومع ذلك، فإن ترتيب التقييمات في مقارنة متسلسلة غير محدد. يُوصى بشدة بعدم استخدام التعبيرات ذات الآثار الجانبية (مثل الطباعة) في المقارنات المتسلسلة. إذا كانت الآثار الجانبية مطلوبة، يجب استخدام عامل التشغيل القصير &&
بشكل صريح (انظر Short-Circuit Evaluation).
Elementary Functions
تقدم جوليا مجموعة شاملة من الدوال الرياضية والمشغلين. يتم تعريف هذه العمليات الرياضية على مجموعة واسعة من القيم العددية التي تسمح بتعريفات منطقية، بما في ذلك الأعداد الصحيحة، وأعداد الفاصلة العائمة، والأعداد النسبية، والأعداد المركبة، حيثما كانت هذه التعريفات منطقية.
علاوة على ذلك، يمكن تطبيق هذه الدوال (مثل أي دالة في جوليا) بطريقة "موجهة" على المصفوفات ومجموعات أخرى باستخدام dot syntax f.(A)
، على سبيل المثال sin.(A)
ستحسب جيب كل عنصر من عناصر المصفوفة A
.
Operator Precedence and Associativity
تطبق جوليا ترتيب وارتباط العمليات التالية، من أعلى أولوية إلى أدنى:
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 |
للحصول على قائمة كاملة من كل أسبقية عوامل جولي، انظر إلى أعلى هذا الملف: src/julia-parser.scm
. لاحظ أن بعض العوامل هناك غير معرفة في وحدة Base
ولكن قد يتم إعطاء تعريفات لها بواسطة المكتبات القياسية أو الحزم أو كود المستخدم.
يمكنك أيضًا العثور على أسبقية الأرقام لأي عامل معين من خلال الدالة المدمجة Base.operator_precedence
، حيث تأخذ الأرقام الأعلى أسبقية:
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)
يمكن أيضًا العثور على رمز يمثل ترابط المشغل عن طريق استدعاء الدالة المدمجة Base.operator_associativity
:
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)
لاحظ أن الرموز مثل :sin
تعيد أولوية 0
. تمثل هذه القيمة مشغلين غير صالحين وليس مشغلين بأدنى أولوية. وبالمثل، يتم تعيين مثل هذه المشغلين إلى الترابط :none
.
Numeric literal coefficients، على سبيل المثال 2x
، تُعتبر عمليات ضرب ذات أسبقية أعلى من أي عملية ثنائية أخرى، باستثناء ^
حيث تكون لها أسبقية أعلى فقط كأُس.
julia> x = 3; 2x^2
18
julia> x = 3; 2^2x
64
التجاور يُحلل مثل عامل أحادي، والذي له عدم تماثل طبيعي حول الأسس: -x^y
و 2x^y
تُحلل كـ -(x^y)
و 2(x^y)
في حين أن x^-y
و x^2y
تُحلل كـ x^(-y)
و x^(2y)
.
Numerical Conversions
تدعم جوليا ثلاثة أشكال من التحويل الرقمي، والتي تختلف في تعاملها مع التحويلات غير الدقيقة.
الترميز
T(x)
أوconvert(T, x)
يحولx
إلى قيمة من نوعT
.- إذا كان
T
نوعًا عائمًا، فإن النتيجة هي أقرب قيمة يمكن تمثيلها، والتي يمكن أن تكون لانهائية موجبة أو سالبة. - إذا كان
T
نوعًا صحيحًا، يتم رفعInexactError
إذا لم يكنx
قابلاً للتمثيل بواسطةT
.
- إذا كان
x % T
يحول عددًا صحيحًاx
إلى قيمة من نوع عدد صحيحT
متوافقة معx
بالنسبة لـ2^n
، حيثn
هو عدد البتات فيT
. بعبارة أخرى، يتم تقصير التمثيل الثنائي ليتناسب.يأخذ Rounding functions نوع
T
كوسيط اختياري. على سبيل المثال،round(Int,x)
هو اختصار لـInt(round(x))
.
تظهر الأمثلة التالية الأشكال المختلفة.
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 لمعرفة كيفية تعريف التحويلات والترقيات الخاصة بك.
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
، و log1p
ضرورية ومفيدة، راجع المدونتين الممتازتين لجون د. كوك حول هذا الموضوع: expm1, log1p, erfc، و hypot.
Trigonometric and hyperbolic functions
جميع الدوال المثلثية والفوقية القياسية مُعرفة أيضًا:
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
هذه كلها دوال ذات وسيط واحد، مع atan
التي تقبل أيضًا وسيطين يتوافقان مع دالة تقليدية atan2
.
بالإضافة إلى ذلك، 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
Special functions
تقدم الحزمة SpecialFunctions.jl العديد من الدوال الرياضية الخاصة الأخرى.
- 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.