Mathematical Operations and Elementary Functions

تقدم جوليا مجموعة كاملة من العمليات الحسابية الأساسية وعمليات بت على جميع أنواعها الأولية الرقمية، بالإضافة إلى توفير تنفيذات محمولة وفعالة لمجموعة شاملة من الدوال الرياضية القياسية.

Arithmetic Operators

النص التالي arithmetic operators مدعوم على جميع الأنواع الرقمية البدائية:

ExpressionNameDescription
+xunary plusthe identity operation
-xunary minusmaps values to their additive inverses
x + ybinary plusperforms addition
x - ybinary minusperforms subtraction
x * ytimesperforms multiplication
x / ydivideperforms division
x ÷ yinteger dividex / y, truncated to an integer
x \ yinverse divideequivalent to y / x
x ^ ypowerraises x to the yth power
x % yremainderequivalent 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 الأنواع:

ExpressionName
!xnegation
x && yshort-circuiting and
x || yshort-circuiting or

تغير النفي true إلى false والعكس صحيح. يتم شرح عمليات التوقف القصير على الصفحة المرتبطة.

لاحظ أن Bool هو نوع صحيح وأن جميع قواعد الترقية المعتادة وعوامل التشغيل الرقمية محددة أيضًا عليه.

Bitwise Operators

النص التالي bitwise operators مدعوم على جميع أنواع الأعداد الصحيحة البدائية:

ExpressionName
~xbitwise not
x & ybitwise and
x | ybitwise or
x ⊻ ybitwise xor (exclusive or)
x ⊼ ybitwise nand (not and)
x ⊽ ybitwise nor (not or)
x >>> ylogical shift right
x >> yarithmetic shift right
x << ylogical/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

إصدارات التحديث لجميع مشغلات الحساب الثنائي ومشغلات بت هي:

+=  -=  *=  /=  \=  ÷=  %=  ^=  &=  |=  ⊻=  >>>=  >>=  <<=
Note

يعمل عامل التحديث على إعادة ربط المتغير الموجود على الجانب الأيسر. ونتيجة لذلك، قد يتغير نوع المتغير.

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

تُعرَف عمليات المقارنة القياسية لجميع الأنواع الرقمية البدائية:

OperatorName
==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

تقدم جوليا وظائف إضافية لاختبار الأرقام للقيم الخاصة، والتي يمكن أن تكون مفيدة في حالات مثل مقارنات مفاتيح التجزئة:

FunctionTests 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 يعتبر NaNs متساوية مع بعضها البعض:

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

تطبق جوليا ترتيب وارتباط العمليات التالية، من أعلى أولوية إلى أدنى:

CategoryOperatorsAssociativity
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

FunctionDescriptionReturn type
round(x)round x to the nearest integertypeof(x)
round(T, x)round x to the nearest integerT
floor(x)round x towards -Inftypeof(x)
floor(T, x)round x towards -InfT
ceil(x)round x towards +Inftypeof(x)
ceil(T, x)round x towards +InfT
trunc(x)round x towards zerotypeof(x)
trunc(T, x)round x towards zeroT

Division functions

FunctionDescription
div(x, y), x÷ytruncated 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%yremainder; 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

FunctionDescription
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

FunctionDescription
sqrt(x), √xsquare root of x
cbrt(x), ∛xcube 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.