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