Integers and Floating-Point Numbers
Tam sayılar ve ondalık değerler, aritmetik ve hesaplamanın temel yapı taşlarıdır. Bu tür değerlerin yerleşik temsilleri sayısal ilkelere denir, oysa tam sayılar ve ondalık sayıların kodda anlık değerler olarak temsilleri sayısal literaller olarak bilinir. Örneğin, 1 bir tam sayı literali iken, 1.0 bir ondalık sayı literali; bunların bellek içindeki ikili temsilleri nesneler olarak sayısal ilkelerdir.
Julia, geniş bir ilkel sayısal tür yelpazesi sunar ve bunlar üzerinde tanımlı bir dizi aritmetik ve bit düzeyinde operatör ile standart matematiksel fonksiyonlar mevcuttur. Bu, modern bilgisayarlarda yerel olarak desteklenen sayısal türler ve işlemlerle doğrudan eşleşir ve böylece Julia'nın hesaplama kaynaklarından tam anlamıyla yararlanmasına olanak tanır. Ayrıca, Julia, yerel donanım temsillerinde etkili bir şekilde temsil edilemeyen sayısal değerler üzerinde işlemler gerçekleştirebilen Arbitrary Precision Arithmetic yazılım desteği sağlar, ancak bu, görece daha yavaş bir performans maliyetiyle gelir.
Aşağıdakiler Julia'nın temel sayısal türleridir:
- Tam sayılar:
| Type | Signed? | Number of bits | Smallest value | Largest value |
|---|---|---|---|---|
Int8 | ✓ | 8 | -2^7 | 2^7 - 1 |
UInt8 | 8 | 0 | 2^8 - 1 | |
Int16 | ✓ | 16 | -2^15 | 2^15 - 1 |
UInt16 | 16 | 0 | 2^16 - 1 | |
Int32 | ✓ | 32 | -2^31 | 2^31 - 1 |
UInt32 | 32 | 0 | 2^32 - 1 | |
Int64 | ✓ | 64 | -2^63 | 2^63 - 1 |
UInt64 | 64 | 0 | 2^64 - 1 | |
Int128 | ✓ | 128 | -2^127 | 2^127 - 1 |
UInt128 | 128 | 0 | 2^128 - 1 | |
Bool | N/A | 8 | false (0) | true (1) |
- Kayan noktalı türler:
| Type | Precision | Number of bits |
|---|---|---|
Float16 | half | 16 |
Float32 | single | 32 |
Float64 | double | 64 |
Ayrıca, Complex and Rational Numbers için tam destek, bu ilkel sayısal türlerin üzerine inşa edilmiştir. Tüm sayısal türler, esnek, kullanıcı genişletilebilir type promotion system sayesinde açık bir tür dönüştürmesi olmadan doğal olarak etkileşimde bulunur.
Integers
Tam sayılar standart şekilde temsil edilir:
julia> 1
1
julia> 1234
1234Tam sayısı literali için varsayılan tür, hedef sistemin 32 bit mimarisi mi yoksa 64 bit mimarisi mi olduğuna bağlıdır:
# 32-bit system:
julia> typeof(1)
Int32
# 64-bit system:
julia> typeof(1)
Int64Julia iç değişkeni Sys.WORD_SIZE, hedef sistemin 32-bit mi yoksa 64-bit mi olduğunu gösterir:
# 32-bit system:
julia> Sys.WORD_SIZE
32
# 64-bit system:
julia> Sys.WORD_SIZE
64Julia ayrıca sistemin imzalı ve imzasız yerel tam sayı türleri için takma ad olan Int ve UInt türlerini tanımlar:
# 32-bit system:
julia> Int
Int32
julia> UInt
UInt32
# 64-bit system:
julia> Int
Int64
julia> UInt
UInt6464 bit'ler ile temsil edilebilen ancak yalnızca 32 bit kullanılarak temsil edilemeyen daha büyük tam sayılar her zaman sistem türünden bağımsız olarak 64 bit tam sayılar oluşturur:
# 32-bit or 64-bit system:
julia> typeof(3000000000)
Int64İşaretsiz tam sayılar, 0x ön eki ve onaltılık (taban 16) rakamlar 0-9a-f kullanılarak girilir ve çıkarılır (büyük harfli rakamlar A-F girdi için de çalışır). İşaretsiz değerin boyutu, kullanılan onaltılık rakam sayısıyla belirlenir:
julia> x = 0x1
0x01
julia> typeof(x)
UInt8
julia> x = 0x123
0x0123
julia> typeof(x)
UInt16
julia> x = 0x1234567
0x01234567
julia> typeof(x)
UInt32
julia> x = 0x123456789abcdef
0x0123456789abcdef
julia> typeof(x)
UInt64
julia> x = 0x11112222333344445555666677778888
0x11112222333344445555666677778888
julia> typeof(x)
UInt128Bu davranış, birinin tam sayı değerleri için işaretsiz onaltılık literaller kullandığında, genellikle bunları yalnızca bir tam sayı değeri olarak değil, sabit bir sayısal bayt dizisini temsil etmek için kullandığı gözlemi üzerine kuruludur.
İkili ve sekizli sayılar da desteklenmektedir:
julia> x = 0b10
0x02
julia> typeof(x)
UInt8
julia> x = 0o010
0x08
julia> typeof(x)
UInt8
julia> x = 0x00000000000000001111222233334444
0x00000000000000001111222233334444
julia> typeof(x)
UInt128Hexadecimal literaller için, ikili ve sekizli literaller işaretsiz tam sayı türleri üretir. İkili veri öğesinin boyutu, eğer literalin baştaki rakamı 0 değilse, gereken en küçük boyuttur. Başta sıfırlar olduğunda, boyut, aynı uzunluğa sahip ancak baştaki rakamı 1 olan bir literalin gereken en küçük boyutu ile belirlenir. Bu, demektir ki:
0x1ve0x12UInt8literallerdir,0x123ve0x1234UInt16literallerdir,0x12345ve0x12345678UInt32literallerdir,0x123456789ve0x1234567890adcdefUInt64literalleri, vb.
Önde gelen sıfır rakamları değere katkıda bulunmasa bile, bir literalın depolama boyutunu belirlemek için sayılır. Bu nedenle 0x01 bir UInt8 iken 0x0001 bir UInt16'dır.
Bu, kullanıcının boyutu kontrol etmesine olanak tanır.
UInt128 değerleri olarak temsil edilemeyecek kadar büyük tamsayıları kodlayan ( 0x ile başlayan) işaretsiz literaller, bunun yerine BigInt değerleri oluşturacaktır. Bu işaretsiz bir tür değildir, ancak bu kadar büyük tamsayı değerlerini temsil edebilecek tek yerleşik türdür.
İkili, sekizli ve onaltılı sayısal ifadeler, işaretsiz sayısal ifadenin hemen önünde bir - ile işaretlenebilir. Bu, işaretsiz sayısal ifadenin üreteceği aynı boyutta işaretsiz bir tam sayı üretir ve değerin iki'nin tamamlayıcısını alır:
julia> -0x2
0xfe
julia> -0x0002
0xfffeTemel sayısal türlerin, örneğin tam sayıların, temsil edilebilen minimum ve maksimum değerleri typemin ve typemax fonksiyonlarıyla verilmektedir:
julia> (typemin(Int32), typemax(Int32))
(-2147483648, 2147483647)
julia> for T in [Int8,Int16,Int32,Int64,Int128,UInt8,UInt16,UInt32,UInt64,UInt128]
println("$(lpad(T,7)): [$(typemin(T)),$(typemax(T))]")
end
Int8: [-128,127]
Int16: [-32768,32767]
Int32: [-2147483648,2147483647]
Int64: [-9223372036854775808,9223372036854775807]
Int128: [-170141183460469231731687303715884105728,170141183460469231731687303715884105727]
UInt8: [0,255]
UInt16: [0,65535]
UInt32: [0,4294967295]
UInt64: [0,18446744073709551615]
UInt128: [0,340282366920938463463374607431768211455]typemin ve typemax tarafından döndürülen değerler her zaman verilen argüman türündedir. (Yukarıdaki ifade, for loops, Strings ve Interpolation dahil olmak üzere henüz tanıtılmamış birkaç özellik kullanmaktadır, ancak bazı mevcut programlama deneyimine sahip kullanıcılar için anlaması oldukça kolay olmalıdır.)
Overflow behavior
Julia'da, belirli bir türün temsil edilebilen maksimum değerini aşmak, bir sarma davranışına yol açar:
julia> x = typemax(Int64)
9223372036854775807
julia> x + 1
-9223372036854775808
julia> x + 1 == typemin(Int64)
trueAritmetik işlemler, Julia'nın tam sayı türleri ile modular arithmetic ile gerçekleştirilir ve modern bilgisayar donanımındaki tam sayı aritmetiğinin özelliklerini yansıtır. Taşma olasılığının olduğu senaryolarda, bu tür taşmalardan kaynaklanabilecek sarılma etkilerini açıkça kontrol etmek önemlidir. Base.Checked modülü, taşma meydana geldiğinde hata tetikleyen taşma kontrolleri ile donatılmış bir dizi aritmetik işlem sunar. Taşmanın herhangi bir koşul altında tolere edilemeyeceği kullanım durumları için, BigInt türünü kullanmak, Arbitrary Precision Arithmetic'da detaylandırıldığı gibi, tavsiye edilir.
Bir taşma davranışı örneği ve bunu potansiyel olarak nasıl çözebileceğiniz aşağıdaki gibidir:
julia> 10^19
-8446744073709551616
julia> big(10)^19
10000000000000000000Division errors
Tam sayı bölmesi (div fonksiyonu) iki istisnai duruma sahiptir: sıfıra bölme ve en düşük negatif sayıyı (typemin) -1'e bölme. Bu iki durum da DivideError hatasını fırlatır. Kalan ve modül fonksiyonları (rem ve mod), ikinci argümanı sıfır olduğunda 4d61726b646f776e2e436f64652822222c20224469766964654572726f722229_40726566 hatasını fırlatır.
Floating-Point Numbers
Açık kayan nokta sayıları standart formatlarda temsil edilir, gerektiğinde E-notation kullanılarak:
julia> 1.0
1.0
julia> 1.
1.0
julia> 0.5
0.5
julia> .5
0.5
julia> -1.23
-1.23
julia> 1e10
1.0e10
julia> 2.5e-4
0.00025Yukarıdaki sonuçlar tümü Float64 değerleridir. Harfi e yerine f yazarak literal Float32 değerleri girilebilir:
julia> x = 0.5f0
0.5f0
julia> typeof(x)
Float32
julia> 2.5f-4
0.00025f0Değerler Float32 kolayca dönüştürülebilir:
julia> x = Float32(-1.5)
-1.5f0
julia> typeof(x)
Float32Onaltı ondalık kesirli literaller de geçerlidir, ancak yalnızca Float64 değerleri olarak, p ile ikili üssü öncesinde:
julia> 0x1p0
1.0
julia> 0x1.8p3
12.0
julia> x = 0x.4p-1
0.125
julia> typeof(x)
Float64Yarı hassas kayan nokta sayıları da desteklenmektedir (Float16), ancak yazılımda uygulanmıştır ve hesaplamalar için Float32 kullanır.
julia> sizeof(Float16(4.))
2
julia> 2*Float16(4.)
Float16(8.0)Alt çizgi _ rakam ayırıcı olarak kullanılabilir:
julia> 10_000, 0.000_000_005, 0xdead_beef, 0b1011_0010
(10000, 5.0e-9, 0xdeadbeef, 0xb2)Floating-point zero
Floating-point sayılar two zeros pozitif sıfır ve negatif sıfırdır. Bunlar birbirine eşittir ancak farklı ikili temsillere sahiptir, bu bitstring fonksiyonu kullanılarak görülebilir:
julia> 0.0 == -0.0
true
julia> bitstring(0.0)
"0000000000000000000000000000000000000000000000000000000000000000"
julia> bitstring(-0.0)
"1000000000000000000000000000000000000000000000000000000000000000"Special floating-point values
Gerçek sayı doğrusundaki herhangi bir noktaya karşılık gelmeyen üç belirli standart kayan nokta değeri vardır:
Float16 | Float32 | Float64 | Name | Description |
|---|---|---|---|---|
Inf16 | Inf32 | Inf | positive infinity | a value greater than all finite floating-point values |
-Inf16 | -Inf32 | -Inf | negative infinity | a value less than all finite floating-point values |
NaN16 | NaN32 | NaN | not a number | a value not == to any floating-point value (including itself) |
Daha fazla tartışma için bu sonlu olmayan kayan nokta değerlerinin birbirleriyle ve diğer floatlarla nasıl sıralandığını görmek için Numeric Comparisons adresine bakın. IEEE 754 standard adresinde, bu kayan nokta değerleri belirli aritmetik işlemlerin sonuçlarıdır:
julia> 1/Inf
0.0
julia> 1/0
Inf
julia> -5/0
-Inf
julia> 0.000001/0
Inf
julia> 0/0
NaN
julia> 500 + Inf
Inf
julia> 500 - Inf
-Inf
julia> Inf + Inf
Inf
julia> Inf - Inf
NaN
julia> Inf * Inf
Inf
julia> Inf / Inf
NaN
julia> 0 * Inf
NaN
julia> NaN == NaN
false
julia> NaN != NaN
true
julia> NaN < NaN
false
julia> NaN > NaN
falsetypemin ve typemax fonksiyonları ayrıca kayan nokta türlerine de uygulanır:
julia> (typemin(Float16),typemax(Float16))
(-Inf16, Inf16)
julia> (typemin(Float32),typemax(Float32))
(-Inf32, Inf32)
julia> (typemin(Float64),typemax(Float64))
(-Inf, Inf)Machine epsilon
Çoğu reel sayı, kayan nokta sayılarıyla tam olarak temsil edilemez ve bu nedenle birçok amaç için, genellikle machine epsilon olarak bilinen, iki bitişik temsil edilebilir kayan nokta sayısı arasındaki mesafeyi bilmek önemlidir.
Julia, eps sağlar, bu da 1.0 ile bir sonraki daha büyük temsil edilebilir kayan nokta değeri arasındaki mesafeyi verir:
julia> eps(Float32)
1.1920929f-7
julia> eps(Float64)
2.220446049250313e-16
julia> eps() # same as eps(Float64)
2.220446049250313e-16Bu değerler 2.0^-23 ve 2.0^-52 sırasıyla Float32 ve Float64 değerleridir. eps fonksiyonu ayrıca bir kayan nokta değerini argüman olarak alabilir ve bu değerin bir sonraki temsil edilebilir kayan nokta değeri ile mutlak farkını verir. Yani, eps(x) ifadesi, x + eps(x) ifadesinin x'den daha büyük olan bir sonraki temsil edilebilir kayan nokta değeri olduğu aynı türde bir değer döndürür:
julia> eps(1.0)
2.220446049250313e-16
julia> eps(1000.)
1.1368683772161603e-13
julia> eps(1e-27)
1.793662034335766e-43
julia> eps(0.0)
5.0e-324İki bitişik temsil edilebilir kayan nokta sayısı arasındaki mesafe sabit değildir, ancak daha küçük değerler için daha küçüktür ve daha büyük değerler için daha büyüktür. Diğer bir deyişle, temsil edilebilir kayan nokta sayıları, sıfıra yakın gerçek sayı doğrusunda en yoğun, sıfırdan uzaklaştıkça ise üssel olarak daha seyrek hale gelir. Tanıma göre, eps(1.0) ile eps(Float64) aynı değerdir çünkü 1.0 64 bitlik bir kayan nokta değeridir.
Julia ayrıca sırasıyla argümana en büyük veya en küçük temsil edilebilir kayan nokta sayısını döndüren nextfloat ve prevfloat fonksiyonlarını sağlar:
julia> x = 1.25f0
1.25f0
julia> nextfloat(x)
1.2500001f0
julia> prevfloat(x)
1.2499999f0
julia> bitstring(prevfloat(x))
"00111111100111111111111111111111"
julia> bitstring(x)
"00111111101000000000000000000000"
julia> bitstring(nextfloat(x))
"00111111101000000000000000000001"Bu örnek, bitişik temsil edilebilir kayan nokta sayıların aynı zamanda bitişik ikili tam sayı temsillerine de sahip olduğu genel ilkeyi vurgulamaktadır.
Rounding modes
Eğer bir sayının tam bir kayan nokta temsili yoksa, uygun bir temsil edilebilir değere yuvarlanması gerekir. Ancak, bu yuvarlama işleminin nasıl yapılacağı, IEEE 754 standard'de sunulan yuvarlama modlarına göre gerektiğinde değiştirilebilir.
Varsayılan kullanılan mod her zaman RoundNearest'dır; bu, en yakın temsil edilebilir değere yuvarlar ve bağlama durumlarında en yakın değere, çift en az anlamlı bit ile yuvarlanır.
Background and References
Kayan noktalı aritmetik, düşük seviyeli uygulama detaylarına aşina olmayan kullanıcılar için sürprizler barındıran birçok incelik içerir. Ancak, bu incelikler çoğu bilimsel hesaplama kitabında ve aşağıdaki referanslarda ayrıntılı olarak açıklanmaktadır:
- Kesin kılavuz, kayan nokta aritmetiği için IEEE 754-2008 Standard; ancak, çevrimiçi olarak ücretsiz olarak mevcut değildir.
- Kayan noktasında, kayan noktalı sayıların nasıl temsil edildiğine dair kısa ama net bir sunum için John D. Cook'un article konusundaki çalışmasına ve bu temsilin, gerçek sayıların idealize edilmiş soyutlamasından nasıl farklı davrandığına dair bazı sorunlara ilişkin introduction çalışmasına bakmanızı öneririm.
- Ayrıca Bruce Dawson'un series of blog posts on floating-point numbers önerilir.
- Mükemmel, derinlemesine bir tartışma için, kayan nokta sayıları ve bunlarla hesaplama yaparken karşılaşılan sayısal doğruluk sorunları hakkında David Goldberg'ün makalesine bakın What Every Computer Scientist Should Know About Floating-Point Arithmetic.
- Daha kapsamlı bir belge için, kayan nokta sayıların tarihi, gerekçesi ve sorunları ile birlikte sayısal hesaplama konularında birçok diğer konuyu tartışmak için collected writings adresine bakabilirsiniz. William Kahan olarak bilinen bu kaynak, "Kayan Noktanın Babası" olarak da anılmaktadır. Özellikle An Interview with the Old Man of Floating-Point adresi ilginizi çekebilir.
Arbitrary Precision Arithmetic
Arbitrary hassas tam sayılar ve kayan nokta sayıları ile hesaplamalara izin vermek için, Julia sırasıyla GNU Multiple Precision Arithmetic Library (GMP) ve GNU MPFR Library'i sarmalar. BigInt ve BigFloat türleri, sırasıyla Julia'da tam sayı ve kayan nokta sayıları için mevcuttur.
Konstrüktörler, bu türleri ilkel sayısal türlerden oluşturmak için vardır ve string literal @big_str veya parse AbstractStringlerden oluşturmak için kullanılabilir. BigIntler, diğer yerleşik tam sayı türleri için çok büyük olduklarında tam sayı literalleri olarak da girdi olarak alınabilir. Base içinde işaretsiz rastgele hassasiyetli bir tam sayı türü olmadığından (BigInt çoğu durumda yeterlidir), onaltılık, sekizli ve ikili literaller (ondalık literallere ek olarak) kullanılabilir.
Bir kez oluşturulduktan sonra, Julia'nın type promotion and conversion mechanism sayesinde tüm diğer sayısal türlerle aritmetik işlemlere katılırlar:
julia> BigInt(typemax(Int64)) + 1
9223372036854775808
julia> big"123456789012345678901234567890" + 1
123456789012345678901234567891
julia> parse(BigInt, "123456789012345678901234567890") + 1
123456789012345678901234567891
julia> string(big"2"^200, base=16)
"100000000000000000000000000000000000000000000000000"
julia> 0x100000000000000000000000000000000-1 == typemax(UInt128)
true
julia> 0x000000000000000000000000000000000
0
julia> typeof(ans)
BigInt
julia> big"1.23456789012345678901"
1.234567890123456789010000000000000000000000000000000000000000000000000000000004
julia> parse(BigFloat, "1.23456789012345678901")
1.234567890123456789010000000000000000000000000000000000000000000000000000000004
julia> BigFloat(2.0^66) / 3
2.459565876494606882133333333333333333333333333333333333333333333333333333333344e+19
julia> factorial(BigInt(40))
815915283247897734345611269596115894272000000000Ancak yukarıdaki ilkel türler ile BigInt/BigFloat arasında tür yükseltmesi otomatik değildir ve açıkça belirtilmelidir.
julia> x = typemin(Int64)
-9223372036854775808
julia> x = x - 1
9223372036854775807
julia> typeof(x)
Int64
julia> y = BigInt(typemin(Int64))
-9223372036854775808
julia> y = y - 1
-9223372036854775809
julia> typeof(y)
BigIntBigFloat işlemlerinin varsayılan hassasiyeti (anlamlı bit sayısı) ve yuvarlama modu, setprecision ve setrounding çağrılarak küresel olarak değiştirilebilir ve tüm sonraki hesaplamalar bu değişiklikleri dikkate alacaktır. Alternatif olarak, hassasiyet veya yuvarlama, belirli bir kod bloğunun yürütülmesi sırasında yalnızca aynı işlevler do bloğu ile kullanılarak değiştirilebilir:
julia> setrounding(BigFloat, RoundUp) do
BigFloat(1) + parse(BigFloat, "0.1")
end
1.100000000000000000000000000000000000000000000000000000000000000000000000000003
julia> setrounding(BigFloat, RoundDown) do
BigFloat(1) + parse(BigFloat, "0.1")
end
1.099999999999999999999999999999999999999999999999999999999999999999999999999986
julia> setprecision(40) do
BigFloat(1) + parse(BigFloat, "0.1")
end
1.1000000000004setprecision veya setrounding ile @big_str arasındaki ilişki, big dize literalleri (örneğin big"0.3") için kullanılan makronun, @big_str bir makro olduğu gerçeği nedeniyle sezgisel olmayabilir. Ayrıntılar için 4d61726b646f776e2e436f64652822222c2022406269675f7374722229_40726566 belgelerine bakın.
Numeric Literal Coefficients
Sayısal formülleri ve ifadeleri daha net hale getirmek için, Julia değişkenlerin hemen önüne bir sayısal literal yerleştirilmesine izin verir, bu da çarpımı ima eder. Bu, polinom ifadelerini yazmayı çok daha temiz hale getirir:
julia> x = 3
3
julia> 2x^2 - 3x + 1
10
julia> 1.5x^2 - .5x + 1
13.0Aynı zamanda üstel fonksiyonlar yazmayı daha şık hale getirir:
julia> 2^2x
64Sayısal sabit katsayıların önceliği, olumsuzlama gibi tekil operatörlerin önceliğinden biraz daha düşüktür. Bu nedenle -2x ifadesi (-2) * x olarak çözülür ve √2x ifadesi (√2) * x olarak çözülür. Ancak, sayısal sabit katsayılar, üstel işlemlerle birleştirildiğinde tekil operatörlerle benzer şekilde çözülür. Örneğin, 2^3x ifadesi 2^(3x) olarak çözülür ve 2x^3 ifadesi 2*(x^3) olarak çözülür.
Sayısal literaller, parantezli ifadelerin katsayıları olarak da çalışır:
julia> 2(x-1)^2 - 3(x-1) + 1
3Sayısal literal katsayılarının örtük çarpım için kullanılan önceliği, çarpma (*) ve bölme (/, \ ve //) gibi diğer ikili operatörlerden daha yüksektir. Bu, örneğin, 1 / 2im ifadesinin -0.5im eşit olduğu ve 6 // 2(2 + 1) ifadesinin 1 // 1 eşit olduğu anlamına gelir.
Ayrıca, parantez içindeki ifadeler değişkenlere katsayı olarak kullanılabilir ve bu, ifadenin değişkenle çarpılmasını ima eder:
julia> (x-1)x
6İki parantezli ifadenin yan yana getirilmesi veya bir değişkenin parantezli ifadenin önüne konulması, çarpımı ima etmek için kullanılamaz:
julia> (x-1)(x+1)
ERROR: MethodError: objects of type Int64 are not callable
julia> x(x+1)
ERROR: MethodError: objects of type Int64 are not callableHer iki ifade de fonksiyon uygulaması olarak yorumlanır: sayısal bir literal olmayan herhangi bir ifade, hemen ardından bir parantez geldiğinde, parantez içindeki değerlere uygulanan bir fonksiyon olarak yorumlanır (fonksiyonlar hakkında daha fazla bilgi için Functions'ya bakın). Bu nedenle, bu iki durumda da, sol taraftaki değer bir fonksiyon olmadığından bir hata meydana gelir.
Yukarıdaki sözdizimsel iyileştirmeler, yaygın matematiksel formüller yazarken oluşan görsel gürültüyü önemli ölçüde azaltır. Sayısal bir sabit katsayı ile çarptığı tanımlayıcı veya parantez içindeki ifade arasında boşluk olmaması gerektiğini unutmayın.
Syntax Conflicts
Yan yana yerleştirilmiş literal katsayı sözdizimi, bazı sayısal literal sözdizimleriyle çelişebilir: onaltılık, sekizlik ve ikilik tam sayı literal'leri ile kayan noktalı literal'ler için mühendislik notasyonu. İşte sözdizimsel çelişkilerin ortaya çıktığı bazı durumlar:
- Hexadecimal tam sayısı ifadesi
0xff, sayısal literal0ilexffdeğişkeninin çarpımı olarak yorumlanabilir. Benzer belirsizlikler,0o777veya0b01001010gibi sekizli ve ikili literal ile de ortaya çıkar. 1e10kayan noktalı sayı ifadesi, sayısal literal1'ine10değişkeni ile çarpıldığı şeklinde yorumlanabilir ve benzer şekilde eşdeğerEbiçimiyle de.- 32-bit kayan noktalı literal ifadesi
1.5f22, sayısal literal1.5'inf22değişkeni ile çarpıldığı şeklinde yorumlanabilir.
Her durumda belirsizlik, sayısal literaller olarak yorumlanması lehine çözülür:
0x/0o/0bile başlayan ifadeler her zaman onaltılık/sekizli/ikilik sayısal değerlerdir.- Sayısal bir literal ile başlayıp
eveyaEile devam eden ifadeler her zaman kayan nokta literalleri olarak kabul edilir. - Sayısal bir literal ile başlayıp
file biten ifadeler her zaman 32-bit kayan nokta literalleri olarak kabul edilir.
E ile tarihsel nedenlerden dolayı sayısal literallerde e ile eşdeğer olmasına karşın, F sadece başka bir harf olup sayısal literallerde f gibi davranmaz. Bu nedenle, bir sayısal literal ile başlayıp ardından F gelen ifadeler, sayısal literalin bir değişkenle çarpımı olarak yorumlanır; bu da demektir ki, örneğin 1.5F22, 1.5 * F22 ile eşittir.
Literal zero and one
Julia, belirli bir tür veya verilen bir değişkenin türü ile ilişkili olarak, literal 0 ve 1 döndüren fonksiyonlar sağlar.
| Function | Description |
|---|---|
zero(x) | Literal zero of type x or type of variable x |
one(x) | Literal one of type x or type of variable x |
Bu fonksiyonlar, gereksiz type conversion yükünden kaçınmak için Numeric Comparisons içinde faydalıdır.
Örnekler:
julia> zero(Float32)
0.0f0
julia> zero(1.0)
0.0
julia> one(Int32)
1
julia> one(BigFloat)
1.0