整數和浮點值是算術和計算的基礎。這些數值的內置表示被稱作原始數值類型(numeric primitive),且整數和浮點數在代碼中作爲立即數時稱作數值字面量(numeric literal)。例如,
1
是個整型字面量,1.0
是個浮點型字面量,它們在內存中作爲對象的二進制表示就是原始數值類型。Julia 提供了很豐富的原始數值類型,並基於它們定義了一整套算術操作,還提供按位運算符以及一些標準數學函數。這些函數能夠直接映射到現代計算機原生支持的數值類型及運算上,因此 Julia 可以充分地利用運算資源。此外,Julia 還爲任意精度算術提供了軟件支持,對於無法使用原生硬件表示的數值類型,Julia 也能夠高效地處理其數值運算。當然,這需要相對的犧牲一些性能。
整型
整型總體上包括有符號型和無符號型,其中這兩大類包括8、16、32、62、128和BigInt和還有bool。分別表示二進制位數。BigInt是高精度整型,他的數字表示範圍無窮大。
類型 | 帶符號? | 比特數 | 最小值 | 最大值 |
---|---|---|---|---|
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) |
|
浮點類型
浮點型分爲半精度Float16、單精度Float32和雙精度Float64。
類型 | 精度 | 比特數 |
---|---|---|
Float16 |
half | 16 |
Float32 |
single | 32 |
Float64 |
double | 64 |
整數字面量以標準形式表示:
julia> 1
1
julia> 1234
1234
整型字面量的默認類型取決於目標系統是 32 位還是 64 位架構:
# 32 位系統:
julia> typeof(1)
Int32
# 64 位系統:
julia> typeof(1)
Int64
- 十六進制數以0x開頭
- 八進制數以0b開頭
- 二進制數以0o開頭
- typemax和typemin函數分別用來返回某個類型的最大最小數
超出一個類型可表示的最大值會溢出。
julia> x = typemax(Int64)
9223372036854775807
julia> x + 1
-9223372036854775808
julia> x + 1 == typemin(Int64)
true
除法錯誤
有兩種情況會產生除法錯誤:除以零和-1除以最小的負數,都會拋出一個DividError錯誤。
浮點數
浮點數字面量也使用標準格式表示,必要時可使用 E-表示法:
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.00025
上面的結果都是 Float64
值。使用 f
替代 e
可以得到 Float32
的字面量:
julia> 0.5f0
0.5f0
julia> typeof(ans)
Float32
julia> 2.5f-4
0.00025f0
數值容易就能轉換成 Float32
:
julia> Float32(-1.5)
-1.5f0
julia> typeof(ans)
Float32
也存在十六進制的浮點數字面量,但只適用於 Float64
值。一般使用 p
前綴及以 2 爲底的指數來表示:
julia> 0x1p0
1.0
julia> 0x1.8p3
12.0
julia> 0x.4p-1
0.125
julia> typeof(ans)
Float64
Julia 也支持半精度浮點數(Float16
),但它們是使用 Float32
進行模擬實現的。
julia> sizeof(Float16(4.))
2
julia> 2*Float16(4.)
Float16(8.0)
下劃線 _
可用作數字分隔符:
julia> 10_000, 0.000_000_005, 0xdead_beef, 0b1011_0010
(10000, 5.0e-9, 0xdeadbeef, 0xb2)
浮點數中有兩個零,0.0和-0.0,這兩個零相等但是有着不同的二進制表示。
特殊的浮點數
有三種特定的標準浮點值不和實數軸上任何一點對應:
Float16 |
Float32 |
Float64 |
名稱 | 描述 |
---|---|---|---|---|
Inf16 |
Inf32 |
Inf |
正無窮 | 一個大於所有有限浮點數的數 |
-Inf16 |
-Inf32 |
-Inf |
負無窮 | 一個小於所有有限浮點數的數 |
NaN16 |
NaN32 |
NaN |
不是數(Not a Number) |
一個不和任何浮點值(包括自己)相等( |
機器精度
大多數實數在都無法用浮點數表示,因此兩個可表示的浮點數的差值叫做機器精度。
Julia 提供了 eps
函數,它可以給出 1.0
與下一個 Julia 能表示的浮點數之間的差值。
julia> eps(Float32)
1.1920929f-7
julia> eps(Float64)
2.220446049250313e-16
julia> eps() # 與 eps(Float64) 相同
2.220446049250313e-16
eps
函數也可以接受一個浮點值作爲參數,然後給出這個值與下一個可表示的值直接的絕對差。
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
Julia 也提供了 nextfloat
和 prevfloat
兩個函數分別返回基於參數的下一個更大或更小的可表示的浮點數:
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"
這個例子體現了一般原則,即相鄰可表示的浮點數也有着相鄰的二進制整數表示。
舍入模式
默認舍入到最接近的可表示的值。
任意精度算術
julia提供了BigInt、BigFloat用來表示任意精度的值,同時也可以用parse函數利用字符串構建任意精度的值。
julia> BigInt(typemax(Int64)) + 1
9223372036854775808
julia> parse(BigInt, "123456789012345678901234567890") + 1
123456789012345678901234567891
julia> parse(BigFloat, "1.23456789012345678901")
1.234567890123456789010000000000000000000000000000000000000000000000000000000004
julia> BigFloat(2.0^66) / 3
2.459565876494606882133333333333333333333333333333333333333333333333333333333344e+19
julia> factorial(BigInt(40))
815915283247897734345611269596115894272000000000
零和一的字面量(這裏不是很理解)
Julia 提供了 0 和 1 的字面量函數,可以返回特定類型或所給變量的類型。
函數 | 描述 |
---|---|
zero(x) |
x 類型或變量 x 的類型的零字面量 |
one(x) |
x 類型或變量 x 的類型的一字面量 |
這些函數在數值比較中可以用來避免不必要的類型轉換帶來的開銷。
例如:
julia> zero(Float32)
0.0f0
julia> zero(1.0)
0.0
julia> one(Int32)
1
julia> one(BigFloat)
1.0