💯

Fortranの装置番号の上限を調べてみた

2022/08/06に公開

TL;DR

  • 最近のコンパイラであれば通常の32bit integer型の上限(2**31-1)まで設定できる。
  • さすがに64bit拡張した整数を入れるとIOエラーになる

Fortranの装置番号について

Fortranでは入出力のために開いたファイルを装置番号という一意な整数値で管理します。

open(77,file="sample.txt")
write(77,*) "This is test"
close(77)

かつてのFortranではこの装置番号には上限がありました。

http://hydro.iis.u-tokyo.ac.jp/~akira/page/Fortran/contents/io/general/unitNumber.html

マシンによって異なるようで、0から99、1から99、0から2,147,483,647など、様々である。

そこで、自分の環境で上限がいくらなのかを調べてみました。

テストコード

program main
  implicit none
  integer(kind=16) :: UNIT_NUMBER = 64 !ここを変えて探索してみる

  open(UNIT_NUMBER,file="test.text")
  write(UNIT_NUMBER,*) "test",UNIT_NUMBER
  close(UNIT_NUMBER)
end program main

コンパイラはCrayのFortran 9.0.2とgfortran 9.4.0を使いました。

結果

まとめると下記のようになります。

  • ともにUNIT_NUMBER=2**30 -1 +2**30(integer型の上限)まで開くことができました。
  • kindを指定しないinteger型で2**31を計算させるとオーバーフローしてエラーになります。
  • kind=16として64bit整数としても、2**31を入れるとopen文がエラーになります。

2**31-1 = 2,147,483,647まであるので、最近のFortranであればあまり上限は気にせず任意の整数を使ってよいという理解でよいでしょう。

また少し主題から外れますが、最近はopen文でnewunitオプションを使うことで動的に割り当てることができたり、inquire文という機能があったり、いちいち装置番号をユーザーが指定しなくてもよいようです。

https://qiita.com/implicit_none/items/840e4de49f8e8dae15a3

Discussion