Julia系列2nd -數據類型

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的整數類型,我們需要考慮兩個方面:

  1. 有無符號
  2. 位數

Julia在確定字面值的過程中:

符號上:十進制數自動確定爲有符號整型,其他進制的數處理爲無符號整數。
位數上:十進制數會默認選擇與OS的位數保持一致,若數字過大,則會選擇更大的位數;而對於其他進制的數,則依據值的大小選擇恰當的位數。

根據需要,我們可以使用:

  1. unsigned() ----- 將有符號數轉爲無符號數,忽略負值檢查;
  2. signed() -------- 將無符號數轉爲有符號數,忽略範圍越界;

這兩個函數在轉換時會講原值變成位數相同的無符號或有符號數。慎用!!!


1.2 進制問題
  1. 0x ---- 表示十六進制數
  2. 0b ---- 表示二進制數
  3. 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專門爲我們提供了兩個有趣的函數:

  1. zero(x): 生成x的0;
  2. one(x): 生成x的1;

2.3 特殊的浮點數
Float16 Float32 Float64 解釋 描述
Inf16 Inf32 Inf 正無窮 大於該類型所能表達的所有有限浮點值
-Inf16 -Inf32 -Inf 負無窮 小於該類型所能表達的所有有限浮點值
NaN16 NaN32 NaN Not a Number 不和任何浮點數(包括自己)相等

需要我們注意以下幾點:

  1. 有了無窮的存在,Julia中的「浮點運算」就可以正常的除零操作(不推薦使用);
  2. 通過**isfinite(x)isinf(x)**來判斷是否是無窮;
  3. 通過**isnan(x)**來判斷是否是NaN;

你會不會有Inf16 > Inf 的疑問呢?

julia> typemax(Float16) < typemax(Float64)
false

  1. 大數運算使用BigInt,BigFloat
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章