Julia主要用於科學計算,所以對於數據類型的支持是相當完備的…
有過編程開發經驗的人,都知道編程語言都離不開整數和浮點數… 下面我們就從這兩方面入手。
- typemin()可以查看數據類型的最小值
- typemax()可以查看數據類型的最大值
- bitstring()可以查看數的二進制表示
- typeof()可以查看任意對象的類型
1. 整數(和布爾)類型
Julia是支持無符號整數和有符號整數的…,在Julia中,布爾類型是可以和整型相互轉化的。(Pythoner 哭暈在廁所裏…)
類型 | 符號 | 比特位 | 最小值 | 最大值 |
---|---|---|---|---|
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 | – | 8 | false(0) | true(1) |
1.1 整數類型的特點
對於Julia的整數類型,我們需要考慮兩個方面:
- 有無符號
- 位數
Julia在確定字面值的過程中:
符號上:十進制數自動確定爲有符號整型,其他進制的數處理爲無符號整數。
位數上:十進制數會默認選擇與OS的位數保持一致,若數字過大,則會選擇更大的位數;而對於其他進制的數,則依據值的大小選擇恰當的位數。
根據需要,我們可以使用:
- unsigned() ----- 將有符號數轉爲無符號數,忽略負值檢查;
- signed() -------- 將無符號數轉爲有符號數,忽略範圍越界;
這兩個函數在轉換時會講原值變成位數相同的無符號或有符號數。慎用!!!
1.2 進制問題
- 0x ---- 表示十六進制數
- 0b ---- 表示二進制數
- 0o ---- 表示八進制數
需要強調的是:這裏的x,b,o只能是小寫字母。
無符號整數會以十六進制的方式展示
1.3 布爾類型(bool)
不能將整型當作bool使用
2. 浮點類型
類型 | 精度 | 比特位 | 最小值 | 最大值 |
---|---|---|---|---|
Float16 | half(半精度) | 16 | -Inf16 | Inf16 |
Float32 | single(單精度) | 32 | -Inf32 | Inf32 |
Float64 | double(雙精度) | 64 | -Inf | Inf |
浮點類型是按照所能表示的精度來劃分的。
Float16基本上用不到,根據官方文檔的說明,Float16是使用Float32進行模擬實現的。如何理解這句話呢?即就算我們遇到Float16的數值,其在內部運算時依然按照Float32進行。
2.1 精度及eps函數
我們知道計算機內部都是二進制的,邏輯判斷非常簡單(非0則1),但是在表達力方面還是有所欠缺的。浮點數在計算機中基本無法準確的表示。
機器精度:計算機中兩個相鄰可表示的浮點數之間的誤差。
Julia 提供了eps()函數 幫助我們去查看1.0和下一個Julia能正確表示的浮點數之間的差值。更加詳細的內容可以去REPL中的幫助模式中查看。
2.2 零及zero(),one()函數
在Julia中,浮點數中有兩個零:正零(0.0)和負零(-0.0)
julia> 0.0 == -0.0
true
julia> bitstring(0.0)
"0000000000000000000000000000000000000000000000000000000000000000"
julia> bitstring(-0.0)
"1000000000000000000000000000000000000000000000000000000000000000"
雖然兩者相等,但是我們發現其在內存中的表示卻不一樣。這自己挖坑自己跳的節奏啊…
爲了避免出現問題,Julia專門爲我們提供了兩個有趣的函數:
- zero(x): 生成x的0;
- one(x): 生成x的1;
2.3 特殊的浮點數
Float16 | Float32 | Float64 | 解釋 | 描述 |
---|---|---|---|---|
Inf16 | Inf32 | Inf | 正無窮 | 大於該類型所能表達的所有有限浮點值 |
-Inf16 | -Inf32 | -Inf | 負無窮 | 小於該類型所能表達的所有有限浮點值 |
NaN16 | NaN32 | NaN | Not a Number | 不和任何浮點數(包括自己)相等 |
需要我們注意以下幾點:
- 有了無窮的存在,Julia中的「浮點運算」就可以正常的除零操作(不推薦使用);
- 通過**isfinite(x)和isinf(x)**來判斷是否是無窮;
- 通過**isnan(x)**來判斷是否是NaN;
你會不會有Inf16 > Inf 的疑問呢?
julia> typemax(Float16) < typemax(Float64)
false
- 大數運算使用BigInt,BigFloat