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 + 2im
Karmaşı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.5172413793103449im
Terfi 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.75im
Not 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.1071487177940904
Her 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.4031192506220405im
Matematiksel 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.0im
literal 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 + 2im
Ancak, 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 + 2im
Bu 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*im
Rational 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//3
Eğ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//3
Bu 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)
3
Payda 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//25
Rasyoneller kolayca kayan noktalı sayılara dönüştürülebilir:
julia> float(3//4)
0.75
Rasyonel 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