跳轉到內容

Fortran/資料型別

來自華夏公益教科書,開放的書籍,開放的世界


變數和資料宣告必須出現在所有 Fortran 程式單元的開頭,在任何可執行語句之前。變數可能具有指定其在記憶體中大小的“型別”。型別引數對每個編譯器或處理器可能具有不同的含義,因此請務必檢查編譯器文件中可用的型別。

宣告風格

[編輯 | 編輯原始碼]

有幾種方法可以宣告變數。現代 Fortran 風格是詳細且明確的。以下示例宣告一個型別為 8 的實數陣列(在大多數編譯器中,這意味著 8 位元組長,即雙精度)。

! Modern variable declaration
! <datatype> [(kind=<num>), <attribute>, ... ::] <identifier>[, ...]
! Example:
real (kind=8), dimension (3) :: variable

dimension 屬性非常長,但當在單行上宣告多個數組時可能更簡潔。如果要宣告單個變數,則在識別符號旁邊使用括號指定維度可能更簡潔。

real (kind=8) :: variable(3)

變數也可以使用賦值進行初始化。

real (kind=8) :: variable(3) = 1.0

:: 對於向後相容舊版 Fortran 是可選的。舊版宣告使用 * 來表示變數的型別。

REAL*8 variable(3)

此外,可以完全省略型別,以簡單地使用編譯器的預設型別。

real variable(3)

內建資料型別

[編輯 | 編輯原始碼]

整數資料型別儲存帶符號整數(即 ..., -3, -2, -1, 0, 1, 2, 3, ...)。在大多數編譯器中,預設型別將整數儲存為 4 位元組大小的短整數(kind=4)。長整數通常為 8 位元組(kind=8)。允許的屬性有:可分配、內在、公有、非同步、可選、儲存、引數、繫結、指標、目標、維度(dims)、私有、值、外部、保護、易變和意圖(inout)。

integer :: variable

邏輯資料型別儲存布林值,只能包含值 .true..false.。大多數編譯器的預設邏輯型別為 4,佔用 4 位元組。因此,邏輯在記憶體方面與整數非常相似,但整數和邏輯通常不相容大多數運算。允許的屬性有:可分配、內在、公有、非同步、可選、儲存、引數、繫結、指標、目標、維度(dims)、私有、值、外部、保護、易變、意圖(inout)。

logical :: variable

實數資料型別儲存浮點資料。值以科學記數法的形式儲存在記憶體中,作為尾數和指數。實數變數的預設型別為 4,包含 4 位元組(32 位)。在這種情況下,24 位用於尾數,8 位用於指數。允許的屬性有:可分配、內在、公有、非同步、可選、儲存、引數、繫結、指標、目標、維度(dims)、私有、值、外部、保護、易變、意圖(inout)。

所有編譯器都至少支援兩種型別的實數型別,用於低精度和高精度數字。但標準沒有指定這些精度的大小。大多數編譯器使用 32 位表示單精度,使用 64 位表示雙精度。因此,許多編譯器支援使用可用更高精度的 double precision 實數資料型別。但是,為了可移植性,最好使用 selected_real_kind 內在函式為變數精度選擇所需的型別引數。

real :: variable
double precision :: variable2

在數學中,複數 具有實部和虛部。Fortran 中的複數以矩形座標的形式儲存為一對實數(實部在前,虛部在後)。複數的預設型別始終與實數資料型別的預設型別相同。因此,型別為 4 的複數變數將包含兩個型別為 4 的實數。如果型別為 4 的實數對應於 4 位元組,則預設的複數變數將為 8 位元組大小。允許的屬性有:可分配、內在、公有、非同步、可選、儲存、引數、繫結、指標、目標、維度(dims)、私有、值、外部、保護、易變、意圖(inout)。

complex :: variable

複數運算

[編輯 | 編輯原始碼]

所有算術運算子都可以在任一邊使用複數。Fortran 自動處理複數運算和虛數的特殊規則。

在使用可能導致錯誤的函式呼叫時必須小心。例如,對實數 -1.0 求平方根將導致錯誤,因為 -1 超出了實數平方根的域。對複數 (-1.0,0.0) 求平方根是允許的,因為 -1 位於複數平方根的域中。

字元資料型別儲存字串。字元變數的預設型別通常為 1,表示 ASCII 字元。型別 2 通常表示 ISO 10646 標準字元。字元變數的獨特之處在於除了 kind 之外,它們還具有 len 引數,該引數指定字串中的字元數。通常單個字元佔用記憶體中的 1 位元組。除此之外,字元資料型別也可以是陣列。

character (len=5,kind=1), dimension (2) :: strings

舊版宣告沒有型別引數,只有長度引數。

CHARACTER*5 strings(2)

字面常量

[編輯 | 編輯原始碼]

表示式中嵌入的資料被稱為字面量或常量。字面量可以根據其寫法具有特定的資料型別。例如,在以下行中,值 1 是一個整數。

a = a + 1

下表展示瞭如何鍵入字面量常量。

字面常量
型別 示例字面量
整數 0, -1, 9999
邏輯 .true., .false., T, F
實數 1.1, 0.0005, -99.9e-99
複數 (-1.0,3), (0.5,-3e5)
字元 'Hello'

請注意,複數的括號表示法不能用於變數。例如,(a, b) 是無效的。要將實數變數轉換為複數,請使用 cmplx 函式

cmplx(a, b)

任何涉及複數和其他數字的表示式都會被提升為複數。

引數常量

[edit | edit source]

常量字面量只是無名的資料。變數也可以是常量。它們透過 parameter 屬性宣告。這些變數是不可變的,在聲明後對它們賦值會導致錯誤。它們在宣告時必須初始化一個值。

real, parameter :: PI = 3.141592
華夏公益教科書