- Fortran 教程
- Fortran - 首頁
- Fortran - 概述
- Fortran - 環境設定
- Fortran - 基本語法
- Fortran - 資料型別
- Fortran - 變數
- Fortran - 常量
- Fortran - 運算子
- Fortran - 決策
- Fortran - 迴圈
- Fortran - 數字
- Fortran - 字元
- Fortran - 字串
- Fortran - 陣列
- Fortran - 動態陣列
- Fortran - 派生資料型別
- Fortran - 指標
- Fortran - 基本輸入輸出
- Fortran - 檔案輸入輸出
- Fortran - 過程
- Fortran - 模組
- Fortran - 本徵函式
- Fortran - 數值精度
- Fortran - 程式庫
- Fortran - 程式設計風格
- Fortran - 除錯程式
- Fortran 資源
- Fortran - 快速指南
- Fortran - 有用資源
- Fortran - 討論
Fortran - 數字
Fortran 中的數字由三種內在資料型別表示:
- 整數型別
- 實數型別
- 複數型別
整數型別
整數型別只能儲存整數值。以下示例提取通常的四位元組整數中可以儲存的最大值:
program testingInt implicit none integer :: largeval print *, huge(largeval) end program testingInt
編譯並執行上述程式後,將產生以下結果:
2147483647
請注意,**huge()** 函式給出特定整數資料型別可以容納的最大數字。您還可以使用 **kind** 說明符指定位元組數。以下示例演示了這一點:
program testingInt
implicit none
!two byte integer
integer(kind = 2) :: shortval
!four byte integer
integer(kind = 4) :: longval
!eight byte integer
integer(kind = 8) :: verylongval
!sixteen byte integer
integer(kind = 16) :: veryverylongval
!default integer
integer :: defval
print *, huge(shortval)
print *, huge(longval)
print *, huge(verylongval)
print *, huge(veryverylongval)
print *, huge(defval)
end program testingInt
編譯並執行上述程式後,將產生以下結果:
32767 2147483647 9223372036854775807 170141183460469231731687303715884105727 2147483647
實數型別
它儲存浮點數,例如 2.0、3.1415、-100.876 等。
傳統上,有兩種不同的 **real** 型別:預設實數型別和 **雙精度** 型別。
但是,Fortran 90/95 透過 **kind** 說明符提供了對實數和整數資料型別精度的更多控制,我們稍後將學習。
以下示例顯示了實數資料型別的用法:
program division implicit none ! Define real variables real :: p, q, realRes ! Define integer variables integer :: i, j, intRes ! Assigning values p = 2.0 q = 3.0 i = 2 j = 3 ! floating point division realRes = p/q intRes = i/j print *, realRes print *, intRes end program division
編譯並執行上述程式後,將產生以下結果:
0.666666687 0
複數型別
這用於儲存複數。複數有兩個部分:實部和虛部。兩個連續的數值儲存單元儲存這兩個部分。
例如,複數 (3.0, -5.0) 等於 3.0 – 5.0i
通用函式 **cmplx()** 建立一個複數。它產生的結果的實部和虛部都是單精度,而不管輸入引數的型別如何。
program createComplex implicit none integer :: i = 10 real :: x = 5.17 print *, cmplx(i, x) end program createComplex
編譯並執行上述程式後,將產生以下結果:
(10.0000000, 5.17000008)
以下程式演示了複數運算:
program ComplexArithmatic implicit none complex, parameter :: i = (0, 1) ! sqrt(-1) complex :: x, y, z x = (7, 8); y = (5, -7) write(*,*) i * x * y z = x + y print *, "z = x + y = ", z z = x - y print *, "z = x - y = ", z z = x * y print *, "z = x * y = ", z z = x / y print *, "z = x / y = ", z end program ComplexArithmatic
編譯並執行上述程式後,將產生以下結果:
(9.00000000, 91.0000000) z = x + y = (12.0000000, 1.00000000) z = x - y = (2.00000000, 15.0000000) z = x * y = (91.0000000, -9.00000000) z = x / y = (-0.283783793, 1.20270276)
數字的範圍、精度和大小
整數的範圍、浮點數的精度和大小取決於分配給特定資料型別的位數。
下表顯示了整數的位數和範圍:
| 位數 | 最大值 | 原因 |
|---|---|---|
| 64 | 9,223,372,036,854,774,807 | (2**63)–1 |
| 32 | 2,147,483,647 | (2**31)–1 |
下表顯示了實數的位數、最小值、最大值和精度。
| 位數 | 最大值 | 最小值 | 精度 |
|---|---|---|---|
| 64 | 0.8E+308 | 0.5E–308 | 15–18 |
| 32 | 1.7E+38 | 0.3E–38 | 6-9 |
以下示例演示了這一點:
program rangePrecision implicit none real:: x, y, z x = 1.5e+40 y = 3.73e+40 z = x * y print *, z end program rangePrecision
編譯並執行上述程式後,將產生以下結果:
x = 1.5e+40
1
Error : Real constant overflows its kind at (1)
main.f95:5.12:
y = 3.73e+40
1
Error : Real constant overflows its kind at (1)
現在讓我們使用一個較小的數字:
program rangePrecision implicit none real:: x, y, z x = 1.5e+20 y = 3.73e+20 z = x * y print *, z z = x/y print *, z end program rangePrecision
編譯並執行上述程式後,將產生以下結果:
Infinity 0.402144760
現在讓我們觀察下溢:
program rangePrecision implicit none real:: x, y, z x = 1.5e-30 y = 3.73e-60 z = x * y print *, z z = x/y print *, z end program rangePrecision
編譯並執行上述程式後,將產生以下結果:
y = 3.73e-60
1
Warning : Real constant underflows its kind at (1)
Executing the program....
$demo
0.00000000E+00
Infinity
Kind 說明符
在科學程式設計中,人們經常需要知道正在進行工作的硬體平臺上資料的範圍和精度。
內在函式 **kind()** 允許您在執行程式之前查詢硬體資料表示的詳細資訊。
program kindCheck implicit none integer :: i real :: r complex :: cp print *,' Integer ', kind(i) print *,' Real ', kind(r) print *,' Complex ', kind(cp) end program kindCheck
編譯並執行上述程式後,將產生以下結果:
Integer 4 Real 4 Complex 4
您還可以檢查所有資料型別的 kind:
program checkKind implicit none integer :: i real :: r character :: c logical :: lg complex :: cp print *,' Integer ', kind(i) print *,' Real ', kind(r) print *,' Complex ', kind(cp) print *,' Character ', kind(c) print *,' Logical ', kind(lg) end program checkKind
編譯並執行上述程式後,將產生以下結果:
Integer 4 Real 4 Complex 4 Character 1 Logical 4