Fortran プログラミングへようこそ!🥳 このステップでは、プログラムで扱う様々なデータの種類、すなわちデータ型について学びます。Fortran は科学技術計算でよく使われる言語であり、様々な種類の数値を効率的に扱うためのデータ型が用意されています。
変数を使う前に、その変数がどのような種類のデータ(数値、文字、真偽値など)を格納するかを宣言する必要があります。これを型宣言と呼びます。Fortran は静的型付け言語であり、プログラムの実行前に各変数の型が決まっている必要があります。これにより、コンパイラがプログラムの正しさをチェックしやすくなり、実行時のエラーを減らすことができます。
古い Fortran コードでは、変数名の最初の文字によって型が決まる「暗黙の型宣言」という機能が使われることがありました(例: I~Nで始まる変数は整数型、それ以外は実数型)。しかし、この機能はプログラムの可読性を下げ、バグの原因となりやすいため、現代的な Fortran プログラミングでは推奨されません。プログラムの冒頭に
implicit none
と記述することで、すべての変数を明示的に宣言することを強制できます。特別な理由がない限り、必ず implicit none
を使用しましょう。🔢 整数型 (INTEGER)
整数、つまり小数点以下のない数値を扱うためのデータ型です。負の数も扱えます。
宣言は INTEGER
キーワードを使います。
implicit none
integer :: count, index, year
整数型には種別 (kind) というパラメータがあり、これによって表現できる数値の範囲を指定できます。多くの環境では、kind 値が格納に必要なバイト数に対応します(例: kind=4 なら 4 バイト)。デフォルトの kind はコンパイラやオプションによりますが、一般的には 4 バイト(約±21億)です。
implicit none
integer(kind=2) :: short_integer ! 2バイト整数 (例: -32768 ~ 32767)
integer(kind=4) :: standard_integer ! 4バイト整数 (デフォルトの場合が多い)
integer(kind=8) :: long_integer ! 8バイト整数 (非常に大きな整数)
ただし、kind の値がバイト数と一致するとは限らないため、特定の範囲や精度が必要な場合は、selected_int_kind
組込み関数を使うのがより移植性の高い方法です。
implicit none
integer, parameter :: ik8 = selected_int_kind(18) ! 10^18 まで表現できる kind を選択
integer(kind=ik8) :: very_large_number
📊 実数型 (REAL)
小数点数を含む数値を扱うためのデータ型です。浮動小数点数とも呼ばれます。
宣言は REAL
キーワードを使います。
implicit none
real :: temperature, pi, velocity
実数型にも種別 (kind) があり、精度(有効桁数)と表現できる数値の範囲を指定します。
- 単精度 (Single Precision): 通常、kind=4 (4 バイト) で、約 6~7 桁の精度を持ちます。デフォルトの REAL は単精度であることが多いです。
- 倍精度 (Double Precision): 通常、kind=8 (8 バイト) で、約 15~16 桁の高い精度を持ちます。科学技術計算では、計算誤差を抑えるために倍精度がよく使われます。
DOUBLE PRECISION
という専用の型宣言も使えます。
implicit none
real(kind=4) :: single_precision_value ! 単精度 (デフォルトの場合が多い)
real(kind=8) :: double_precision_value ! 倍精度
double precision :: another_double_value ! 倍精度 (専用の型宣言)
整数型と同様に、移植性を高めるためには selected_real_kind
組込み関数を使うことが推奨されます。引数には、必要な最低限の有効桁数 (p) や指数範囲 (r) を指定します。
implicit none
integer, parameter :: sp = selected_real_kind(p=6, r=37) ! 単精度相当の kind を選択
integer, parameter :: dp = selected_real_kind(p=15, r=307) ! 倍精度相当の kind を選択
real(kind=sp) :: result_sp
real(kind=dp) :: result_dp
実数定数に
_kind名
を付けることで、その定数の精度を明示できます。real(kind=dp) :: pi_dp
pi_dp = 3.14159265358979323846_dp ! 倍精度定数
1.0e0
(単精度), 1.0d0
(倍精度) のような指数表記もよく使われます。🌀 複素数型 (COMPLEX)
複素数(実部と虚部のペア)を扱うためのデータ型です。
宣言は COMPLEX
キーワードを使います。
implicit none
complex :: z, frequency_response
複素数型も実数型と同様に種別 (kind) を持ち、実部と虚部それぞれの実数型の精度を指定します。
implicit none
integer, parameter :: dp = selected_real_kind(p=15) ! 倍精度 kind
complex(kind=dp) :: z_dp ! 実部・虚部ともに倍精度
complex(kind=kind(0.0)) :: z_sp ! 実部・虚部ともに単精度 (kind(0.0) は単精度実数の kind)
複素数定数は (実部, 虚部)
の形式で記述します。
implicit none
integer, parameter :: dp = selected_real_kind(p=15)
complex(kind=dp) :: z1, z2
z1 = (1.0_dp, 2.0_dp) ! 1.0 + 2.0i (倍精度)
z2 = cmplx(3.0, 4.0, kind=dp) ! 組込み関数 cmplx を使う方法もある
🔡 文字列型 (CHARACTER)
文字列(テキストデータ)を扱うためのデータ型です。
宣言は CHARACTER
キーワードを使います。文字列の長さを指定する必要があります。長さを指定しない場合、デフォルトで長さ 1 になります。
implicit none
character(len=10) :: name ! 長さ 10 の固定長文字列
character(length=5) :: code ! length キーワードも使える
character :: initial ! 長さ 1 の文字列
character*20 :: address ! 古い形式の宣言 (長さ 20)
文字列定数はシングルクォート ('
) またはダブルクォート ("
) で囲みます。
implicit none
character(len=10) :: message
message = 'Hello' ! 'Hello ' (残りは空白で埋められる)
message = "Fortran!" ! 'Fortran! '
モダン Fortran では、長さを後から変更できる可変長文字列も利用できます。これは ALLOCATABLE
属性を使って宣言します。
implicit none
character(len=:), allocatable :: text ! 可変長文字列の宣言
text = "This is a variable length string."
print *, len(text) ! 文字列の長さを表示
text = text // " More text." ! 文字列の結合
print *, text
文字型にも kind がありますが、通常はデフォルトの kind (ASCII や UTF-8 など、処理系に依存) を使用します。selected_char_kind
関数で特定の文字セット (例: ‘ISO_10646’ for Unicode) の kind を取得することもできます。
❓ 論理型 (LOGICAL)
真 (True) または偽 (False) のいずれかの値をとるデータ型です。条件分岐 (IF 文) などでよく使われます。
宣言は LOGICAL
キーワードを使います。
implicit none
logical :: is_found, has_converged, file_exists
論理型の定数は .TRUE.
と .FALSE.
の 2 つだけです (前後のピリオドに注意)。
implicit none
logical :: flag1, flag2
integer :: i, j
i = 10
j = 5
flag1 = .TRUE.
flag2 = (i > j) .AND. (i < 100) ! 比較演算子や論理演算子の結果を代入できる
! この場合 flag2 は .TRUE. になる
print *, flag1, flag2
論理型にも kind が存在しますが、通常はデフォルトの kind が使われます。これは多くの場合、デフォルトの整数型と同じ kind になります。
まとめ
Fortran の基本的な組込みデータ型 5 種類を見てきました。
データ型 | キーワード | 説明 | 例 |
---|---|---|---|
整数型 | INTEGER | 整数を扱う | 10 , -5 , 0 |
実数型 | REAL , DOUBLE PRECISION | 小数点数を含む数値を扱う(浮動小数点数) | 3.14 , -0.5e-3 , 1.23d0 |
複素数型 | COMPLEX | 複素数を扱う(実部と虚部のペア) | (1.0, -2.5) |
文字列型 | CHARACTER | 文字列(テキスト)を扱う | 'Hello' , "Fortran" |
論理型 | LOGICAL | 真 (True) または偽 (False) を扱う | .TRUE. , .FALSE. |
これらのデータ型を適切に使い分けることが、効率的で正確なプログラムを作成するための第一歩です。特に数値計算では、INTEGER
と REAL
(単精度・倍精度) の違いを理解し、必要な精度に応じて使い分けることが重要になります。💡
次のステップでは、これらのデータ型を使って変数を宣言し、値を代入したり演算したりする方法を学びます。
参考情報
- Fortran Programming Language – Types and kinds: https://fortran-lang.org/learn/quickstart/types
- Fortran Wiki – Intrinsic types: https://fortranwiki.org/fortran/show/Intrinsic+types
- GNU Fortran Compiler Documentation – KIND Type Parameters: https://gcc.gnu.org/onlinedocs/gfortran/Kind-Type-Parameters.html
コメント