[Fortranのはじめ方] Part5: データ型(INTEGER, REAL, COMPLEX, CHARACTER, LOGICAL)

Fortran

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

🌀 複素数型 (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.

これらのデータ型を適切に使い分けることが、効率的で正確なプログラムを作成するための第一歩です。特に数値計算では、INTEGERREAL (単精度・倍精度) の違いを理解し、必要な精度に応じて使い分けることが重要になります。💡

次のステップでは、これらのデータ型を使って変数を宣言し、値を代入したり演算したりする方法を学びます。

参考情報

コメント

タイトルとURLをコピーしました