Complex and Rational Numbers
Julia, karmaşık ve rasyonel sayılar için önceden tanımlanmış türler içerir ve bunlar üzerinde tüm standart Mathematical Operations and Elementary Functions desteklenir. Conversion and Promotion önceden tanımlanmış sayısal türlerin herhangi bir kombinasyonu üzerinde, ister ilkel ister bileşik olsun, işlemlerin beklenildiği gibi davranmasını sağlamak için tanımlanmıştır.
Complex Numbers
Küresel sabit im, -1'in ana karekökünü temsil eden i karmaşık sayısına bağlanmıştır. (Bu küresel sabit için matematikçilerin i veya mühendislerin j kullanılması, bu kadar popüler indeks değişkeni adları olduğu için reddedilmiştir.) Julia, sayısal literalleri juxtaposed with identifiers as coefficients olarak tanımlamaya izin verdiğinden, bu bağlama karmaşık sayılar için geleneksel matematiksel notasyona benzer bir sözdizimi sağlamak için yeterlidir:
julia> 1+2im
1 + 2imKarmaşık sayılarla tüm standart aritmetik işlemleri gerçekleştirebilirsiniz:
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.5172413793103449imTerfi mekanizması, farklı türdeki operandların kombinasyonlarının sorunsuz bir şekilde çalışmasını sağlar:
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.75imNot edin ki 3/4im == 3/(4*im) == -(3/4*im), çünkü bir literal katsayı bölmeden daha sıkı bağlanır.
Standart karmaşık değerleri manipüle etmek için işlevler sağlanmıştır:
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.1071487177940904Her zamanki gibi, bir karmaşık sayının mutlak değeri (abs) sıfıra olan mesafesidir. abs2 mutlak değerin karesini verir ve karmaşık sayılar için özellikle kullanışlıdır çünkü karekök alma işlemini atlar. angle radyan cinsinden faz açısını döndürür (aynı zamanda argüman veya arg fonksiyonu olarak da bilinir). Karmaşık sayılar için diğer Elementary Functions tanımları da mevcuttur:
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.4031192506220405imMatematiksel fonksiyonların genellikle gerçek sayılara uygulandıklarında gerçek değerler, karmaşık sayılara uygulandıklarında ise karmaşık değerler döndürdüğünü unutmayın. Örneğin, sqrt -1 ile -1 + 0im'e uygulandığında farklı davranır, oysa -1 == -1 + 0im'dir:
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.0imliteral numeric coefficient notation karmaşık bir sayı oluşturulurken değişkenlerden çalışmaz. Bunun yerine, çarpma açıkça yazılmalıdır:
julia> a = 1; b = 2; a + b*im
1 + 2imAncak, bu tavsiye edilmez. Bunun yerine, karmaşık bir değeri doğrudan reel ve sanal parçalarından oluşturmak için daha verimli complex fonksiyonunu kullanın:
julia> a = 1; b = 2; complex(a, b)
1 + 2imBu yapı çarpma ve toplama işlemlerinden kaçınır.
Inf ve NaN karmaşık sayılarda karmaşık sayının reel ve sanal kısımlarında Special floating-point values bölümünde açıklandığı gibi yayılır:
julia> 1 + Inf*im
1.0 + Inf*im
julia> 1 + NaN*im
1.0 + NaN*imRational Numbers
Julia, tam sayıları tam oranlarını temsil etmek için bir rasyonel sayı türüne sahiptir. Rasyoneller, // operatörü kullanılarak oluşturulur:
julia> 2//3
2//3Eğer bir rasyonel sayının payı ve paydası ortak çarpanlara sahipse, bunlar en düşük terimlere indirgenir ve payda negatif olmamalıdır:
julia> 6//9
2//3
julia> -4//8
-1//2
julia> 5//-15
-1//3
julia> -4//-12
1//3Bu tam sayılar oranı için normalize edilmiş form benzersizdir, bu nedenle rasyonel değerlerin eşitliği, pay ve paydanın eşitliğini kontrol ederek test edilebilir. Bir rasyonel değerin standartlaştırılmış payı ve paydası, numerator ve denominator fonksiyonları kullanılarak çıkarılabilir:
julia> numerator(2//3)
2
julia> denominator(2//3)
3Payda ve payın doğrudan karşılaştırılması genellikle gerekli değildir, çünkü standart aritmetik ve karşılaştırma işlemleri rasyonel değerler için tanımlanmıştır:
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//25Rasyoneller kolayca kayan noktalı sayılara dönüştürülebilir:
julia> float(3//4)
0.75Rasyonel sayılardan kayan noktalı sayılara dönüşüm, a ve b için herhangi bir tam sayı değeri için aşağıdaki kimliği korur, yalnızca a==0 && b <= 0 durumunda değil:
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)Sonsuz rasyonel değerler oluşturmak kabul edilebilir:
julia> 5//0
1//0
julia> x = -3//0
-1//0
julia> typeof(x)
Rational{Int64}NaN rasyonel değeri oluşturmaya çalışıyorum, ancak geçersiz:
julia> 0//0
ERROR: ArgumentError: invalid rational: zero(Int64)//zero(Int64)
Stacktrace:
[...]Her zamanki gibi, terfi sistemi diğer sayısal türlerle etkileşimleri zahmetsiz hale getirir:
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