Complex and Rational Numbers

تتضمن جوليا أنواعًا محددة مسبقًا لكل من الأعداد المركبة والعقلانية، وتدعم جميع Mathematical Operations and Elementary Functions عليها. Conversion and Promotion تم تعريفها بحيث تعمل العمليات على أي مجموعة من الأنواع الرقمية المحددة مسبقًا، سواء كانت بدائية أو مركبة، كما هو متوقع.

Complex Numbers

الثابت العالمي im مرتبط بالعدد المركب i، الذي يمثل الجذر التربيعي الرئيسي لـ -1. (تم رفض استخدام i للرياضيين أو j للمهندسين كاسم لهذا الثابت العالمي لأنه أسماء متغيرات فهرس شائعة جدًا.) نظرًا لأن جوليا تسمح بالثوابت الرقمية أن تكون juxtaposed with identifiers as coefficients، فإن هذا الربط يكفي لتوفير بناء جملة مريح للأعداد المركبة، مشابه للتدوين الرياضي التقليدي:

julia> 1+2im
1 + 2im

يمكنك إجراء جميع العمليات الحسابية القياسية مع الأعداد المركبة:

julia> (1 + 2im)*(2 - 3im)
8 + 1im

julia> (1 + 2im)/(1 - 2im)
-0.6 + 0.8im

julia> (1 + 2im) + (1 - 2im)
2 + 0im

julia> (-3 + 2im) - (5 - 1im)
-8 + 3im

julia> (-1 + 2im)^2
-3 - 4im

julia> (-1 + 2im)^2.5
2.729624464784009 - 6.9606644595719im

julia> (-1 + 2im)^(1 + 1im)
-0.27910381075826657 + 0.08708053414102428im

julia> 3(2 - 5im)
6 - 15im

julia> 3(2 - 5im)^2
-63 - 60im

julia> 3(2 - 5im)^-1.0
0.20689655172413793 + 0.5172413793103449im

آلية الترقية تضمن أن تعمل تركيبات المعاملات من أنواع مختلفة بشكل صحيح:

julia> 2(1 - 1im)
2 - 2im

julia> (2 + 3im) - 1
1 + 3im

julia> (1 + 2im) + 0.5
1.5 + 2.0im

julia> (2 + 3im) - 0.5im
2.0 + 2.5im

julia> 0.75(1 + 2im)
0.75 + 1.5im

julia> (2 + 3im) / 2
1.0 + 1.5im

julia> (1 - 3im) / (2 + 2im)
-0.5 - 1.0im

julia> 2im^2
-2 + 0im

julia> 1 + 3/4im
1.0 - 0.75im

لاحظ أن 3/4im == 3/(4*im) == -(3/4*im)، حيث أن معامل النص الحرفي يرتبط بشكل أقوى من القسمة.

تُقدَّم دوال قياسية للتلاعب بالقيم المعقدة:

julia> z = 1 + 2im
1 + 2im

julia> real(1 + 2im) # real part of z
1

julia> imag(1 + 2im) # imaginary part of z
2

julia> conj(1 + 2im) # complex conjugate of z
1 - 2im

julia> abs(1 + 2im) # absolute value of z
2.23606797749979

julia> abs2(1 + 2im) # squared absolute value
5

julia> angle(1 + 2im) # phase angle in radians
1.1071487177940904

كما هو معتاد، القيمة المطلقة (abs) لعدد مركب هي مسافته من الصفر. abs2 يعطي مربع القيمة المطلقة، وهو مفيد بشكل خاص للأعداد المركبة لأنه يتجنب أخذ الجذر التربيعي. angle يعيد زاوية الطور بالراديان (المعروفة أيضًا باسم الحجة أو دالة arg). تم تعريف مجموعة كاملة من Elementary Functions أيضًا للأعداد المركبة:

julia> sqrt(1im)
0.7071067811865476 + 0.7071067811865475im

julia> sqrt(1 + 2im)
1.272019649514069 + 0.7861513777574233im

julia> cos(1 + 2im)
2.0327230070196656 - 3.0518977991517997im

julia> exp(1 + 2im)
-1.1312043837568135 + 2.4717266720048188im

julia> sinh(1 + 2im)
-0.4890562590412937 + 1.4031192506220405im

لاحظ أن الدوال الرياضية عادةً ما تُرجع قيمًا حقيقية عند تطبيقها على أعداد حقيقية وقيمًا معقدة عند تطبيقها على أعداد معقدة. على سبيل المثال، sqrt يتصرف بشكل مختلف عند تطبيقه على -1 مقابل -1 + 0im على الرغم من أن -1 == -1 + 0im:

julia> sqrt(-1)
ERROR: DomainError with -1.0:
sqrt was called with a negative real argument but will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).
Stacktrace:
[...]

julia> sqrt(-1 + 0im)
0.0 + 1.0im

literal numeric coefficient notation لا يعمل عند بناء عدد مركب من المتغيرات. بدلاً من ذلك، يجب كتابة الضرب بشكل صريح:

julia> a = 1; b = 2; a + b*im
1 + 2im

ومع ذلك، فإن هذا ليس موصى به. بدلاً من ذلك، استخدم الدالة الأكثر كفاءة complex لإنشاء قيمة معقدة مباشرة من أجزائها الحقيقية والتخييلية:

julia> a = 1; b = 2; complex(a, b)
1 + 2im

تتجنب هذه البنية عمليات الضرب والجمع.

Inf و NaN تنتشر من خلال الأعداد المركبة في الأجزاء الحقيقية والتخييلية لعدد مركب كما هو موصوف في قسم Special floating-point values:

julia> 1 + Inf*im
1.0 + Inf*im

julia> 1 + NaN*im
1.0 + NaN*im

Rational Numbers

جوليا لديها نوع عدد كسري لتمثيل النسب الدقيقة للأعداد الصحيحة. يتم إنشاء الكسور باستخدام عامل //:

julia> 2//3
2//3

إذا كان البسط والمقام في كسر عادي لهما عوامل مشتركة، يتم اختزالهما إلى أدنى حد بحيث يكون المقام غير سالب:

julia> 6//9
2//3

julia> -4//8
-1//2

julia> 5//-15
-1//3

julia> -4//-12
1//3

هذه الصورة الموحدة لنسبة الأعداد الصحيحة فريدة، لذا يمكن اختبار تساوي القيم الكسرية من خلال التحقق من تساوي البسط والمقام. يمكن استخراج البسط والمقام القياسيين لقيمة كسرية باستخدام الدوال numerator و denominator:

julia> numerator(2//3)
2

julia> denominator(2//3)
3

المقارنة المباشرة بين البسط والمقام عادةً ليست ضرورية، حيث إن العمليات الحسابية القياسية وعمليات المقارنة محددة للقيم الكسرية:

julia> 2//3 == 6//9
true

julia> 2//3 == 9//27
false

julia> 3//7 < 1//2
true

julia> 3//4 > 2//3
true

julia> 2//4 + 1//6
2//3

julia> 5//12 - 1//4
1//6

julia> 5//8 * 3//12
5//32

julia> 6//5 / 10//7
21//25

يمكن تحويل الأعداد النسبية بسهولة إلى أعداد نقطية:

julia> float(3//4)
0.75

تحويل من الكسر إلى النقطة العائمة يحترم الهوية التالية لأي قيم صحيحة لـ a و b، باستثناء عندما يكون a==0 && b <= 0:

julia> a = 1; b = 2;

julia> isequal(float(a//b), a/b)
true

julia> a, b = 0, 0
(0, 0)

julia> float(a//b)
ERROR: ArgumentError: invalid rational: zero(Int64)//zero(Int64)
Stacktrace:
[...]

julia> a/b
NaN

julia> a, b = 0, -1
(0, -1)

julia> float(a//b), a/b
(0.0, -0.0)

إنشاء قيم كسرية لانهائية مقبول:

julia> 5//0
1//0

julia> x = -3//0
-1//0

julia> typeof(x)
Rational{Int64}

محاولة بناء قيمة عقلانية NaN، ومع ذلك فهي غير صالحة:

julia> 0//0
ERROR: ArgumentError: invalid rational: zero(Int64)//zero(Int64)
Stacktrace:
[...]

كما هو معتاد، فإن نظام الترقية يجعل التفاعلات مع أنواع الأرقام الأخرى سهلة للغاية:

julia> 3//5 + 1
8//5

julia> 3//5 - 0.5
0.09999999999999998

julia> 2//7 * (1 + 2im)
2//7 + 4//7*im

julia> 2//7 * (1.5 + 2im)
0.42857142857142855 + 0.5714285714285714im

julia> 3//2 / (1 + 2im)
3//10 - 3//5*im

julia> 1//2 + 2im
1//2 + 2//1*im

julia> 1 + 2//3im
1//1 - 2//3*im

julia> 0.5 == 1//2
true

julia> 0.33 == 1//3
false

julia> 0.33 < 1//3
true

julia> 1//3 - 0.33
0.0033333333333332993