NAG Fortran コンパイラ
FAQ – よくある質問とその答え

  • 「multiple definition of `main'」というリンクエラーが出てプログラムがビルドできません。 [答え]
  • プログラムの実行時診断(実行時エラー検出)機能を使うにはどうすれば良いですか? [答え]
  • メモリリークがあるかどうかを調べる方法を教えてください。 [答え]
  • プログラムの最適化(-On )を行うにはどうすれば良いですか? [答え]
  • 固定形式のプログラム(*.f, *.for)を自由形式のプログラム(*.f95)に変換できますか? [答え]
  • ソースプログラムの整形機能(C で言うところの cb の様な機能)はありますか? [答え]
  • コールグラフとは何ですか? [答え]
  • 混合言語プログラミング時の f90_init と f90_io_finish という関数は何ですか? [答え]
  • Fortran 77 のプログラムをコンパイルするには、何らかのコンパイラオプションを指定する必要がありますか? [答え]
  • NAG Fortranコンパイラ が私の古い(レガシーな)Fortran 77 のプログラムを受け付けてくれません。 [答え]
  • Fortran 77 と Fortran 90/95 のソースファイルが混在しているプロジェクトなのですが、コンパイルは大丈夫でしょうか? [答え]
  • CDABS(A)、DCMPLX(X,Y)、DCONJG(Z)、DIMAG(Z)、DREAL(Z) はどうすれば利用できますか? [答え]
  • 関数 system はありますか? [答え]
  • 関数 getenv はありますか? [答え]
  • 関数 flush はありますか? [答え]
  • 関数 fdate を含むプログラムのコンパイルができません。 [答え]
  • 関数 dtime や etime を含むプログラムのコンパイルができません。 [答え]
  • 「TAB 書式入力です(TAB format input)」という警告メッセージが出ます。 [答え]
  • 「数値データ型にバイト数が指定されました(Byte count on numeric data type)」という警告メッセージが出ます。 [答え]
  • 「KIND 値 (*) が有効な表現方法ではありません(KIND value (*) does not specify a valid representation method)」というエラーが出てプログラムがコンパイルできません。他のコンパイラでは問題なく動いているプログラムです。 [答え]
  • 入力バッファにおいてレコードが長すぎます(Record too long for input buffer)」または「出力においてバッファオーバーフローが発生しました(Buffer overflow on output)」というエラーはどういうことでしょうか? [答え]
  • 「変数 ** のサイズ (*********** バイト) が大きすぎます(Variable ** size of *********** bytes is too big)」というエラーが出てプログラムがコンパイルに通りません。 [答え]
  • 実行ファイルを他のマシンで実行しようとするとエラーが出て実行ができません。 (「libf53.* が見つからなかったため、このアプリケーションを開始できませんでした。 ... 」といった意味のエラーが表示されます。) [答え]
  • 「警告:浮動小数アンダーフローが発生しました(Warning: Floating underflow occurred)」という警告メッセージがプログラムの実行時に出ます。 アンダーフローがどこで発生したかを調べる方法はありますか? [答え]
  • 「警告:浮動小数アンダーフローが発生しました(Warning: Floating underflow occurred)」という警告メッセージがプログラムの実行時に出ます。 この警告メッセージの出力を抑止することはできますか? [答え]
  • 4倍精度をサポートしていますか? [答え]
  • 編集記述子 $(改行抑止)はサポートしていないのですか? [答え]
  • Fortran の組込み関数(例えば CDEXP)をコンパイラが認識しません(コンパイルに通りません)。 [答え]

qa 「multiple definition of `main'」というリンクエラーが出てプログラムがビルドできません。
qa

これはリンク時に複数の主プログラムが存在しているために出ているエラーです。

複数の主プログラムが存在しないかどうか確認して下さい。


qa プログラムの実行時診断(実行時エラー検出)機能を使うにはどうすれば良いですか?
qa

プログラムの実行時診断(実行時エラー検出)機能を有効にするには、コンパイラオプションで-Cを設定してください。

例)

nagfor -C myprog.f90
「ダングリングポインタ (=dangling)」、「未定義の変数 (=undefined)」を除く全てのチェック項目が有効になります。

nagfor -C=all myprog.f90
「未定義の変数 (=undefined)」を除く全てのチェック項目が有効になります。

nagfor -C=all -C=undefined myprog.f90
全てのチェック項目が有効になります。

※ オプションの詳細は NAG Fortran コンパイラマニュアル「NAG Fortran Compiler, Release 6.1 マニュアル - 2.4 コンパイラオプション」をご参照ください。

NAG Fortran コンパイラ は検出された実行時エラーは標準出力へ出力します。

補足:
Fortran 言語標準に従って検出される通常の実行時エラーは、上記オプションの指定に関係なく検出されます。


qa メモリリークがあるかどうかを調べる方法を教えてください。
qa

プログラムのメモリトレース(メモリリーク検出)機能を有効にするには、NAG Fortran コンパイラでメモリトレースオプション (-mtrace=) を設定してください。

例)

nagfor -mtrace=all myprog.f90
全ての詳細設定が有効になります。

※ オプションの詳細は NAG Fortran コンパイラマニュアル「NAG Fortran Compiler, Release 6.1 マニュアル - 2.4 コンパイラオプション」をご参照ください。

メモリトレースの結果は標準出力へ出力されます。

(メモリ診断の出力例)

 3 allocations
 No memory leaked

[Allocated item 1 (size 1025) = Z'2BB0010']
[Allocated item 2 (size 1025) = Z'2BB0430']
[Allocated item 3 (size 1025) = Z'2BB0850']
[Deallocated item 2 (size 1025, at Z'2BB0430')]
[Deallocated item 3 (size 1025, at Z'2BB0850')]
[Deallocated item 1 (size 1025, at Z'2BB0010')]

注意:
このオプションは「自動的ガーベージコレクションを有効にする (-gc)」オプション(コンパイラオプション -gc に相当)と互換性がありません。両方のオプションにチェックが入っているとコンパイルエラーとなります。


qa プログラムの最適化(-On )を行うにはどうすれば良いですか?
qa

プログラムの最適化は NAG Fortran コンパイラ のコンパイラオプション -Onn は最適化レベル 0 〜 4)を指定して行います。

NAG Fortran コンパイラはデフォルトでは「最適化なし」(-O0 に相当)が設定されています。

※ オプションの詳細は NAG Fortran コンパイラマニュアル「NAG Fortran Compiler, Release 6.1 マニュアル - 2.4 コンパイラオプション」をご参照ください。


qa 固定形式のプログラム(*.f, *.for)を自由形式のプログラム(*.f95)に変換できますか?
qa

はい、可能です。
NAG Fortran コンパイラのコマンドオプションで =polish を指定して下さい。

例)

nagfor =polish fixed.f -o free.f90
固定形式の fixed.f を自由形式の free.f90 に変換します。

NAG Fortran コンパイラのコマンドオプションの指定で整形内容 (インデント幅や文番号の再設定など)を細かく指定できます。

※ オプションの詳細は NAG Fortran コンパイラマニュアル「NAG Fortran Compiler, Release 6.1 マニュアル - 2.23 ソース整形」をご参照ください。

注意:
変換は元のプログラムが NAG Fortran コンパイラでコンパイルに通るプログラムであること(つまり正しい Fortran のプログラムであること)が前提となります。


qa ソースプログラムの整形機能(C で言うところの cb の様な機能)はありますか?
qa

はい、あります。
NAG Fortran コンパイラのコマンドオプションで =polish を指定して下さい。

例)

nagfor =polish myprog.f90 -o myprogOut.f90
myprog.f90 を整形して myprogOut.f90 に出力します。

NAG Fortran コンパイラのコマンドオプションの指定で整形内容 (インデント幅や文番号の再設定など)を細かく指定できます。

※ オプションの詳細は NAG Fortran コンパイラマニュアル「NAG Fortran Compiler, Release 6.1 マニュアル - 2.23 ソース整形」をご参照ください。

注意:
整形は元のプログラムが NAG Fortran コンパイラでコンパイルに通るプログラムであること(つまり正しい Fortran のプログラムであること)が前提となります。


qa コールグラフとは何ですか?
qa

コールグラフとは、コンピュータプログラムの手続き間の呼び出し関係を表現した有向グラフです。

NAG Fortran コンパイラ には「コールグラフの作成」機能が搭載されており、Fortran プログラム(主プログラム、外部副プログラム、モジュール)の手続き(サブルーチン、関数)間の呼び出し関係を出力することができます。

この機能は NAG Fortran コンパイラ のコマンドオプションで =callgraph を指定して下さい。

※ オプションの詳細は NAG Fortran コンパイラマニュアル「NAG Fortran Compiler, Release 6.1 マニュアル - 2.20 コールグラフの生成」をご参照ください。

例)

nagfor =callgraph myprog.f90
コールグラフを出力します。

nagfor =callgraph -calledby myprog.f90
コールグラフ及び呼び出し元を出力します。

nagfor =callgraph -calledby -index myprog.f90 mysub.f90 -o out.txt
コールグラフ、索引、及び呼び出し元を out.txt へ出力します。

出力例)

コールグラフ 2011年12月02日 15:31

    1: MAIN
    2:     SUB


コールグラフの索引

   行    手続
    1    MAIN
    2    SUB


呼び出しテーブル

  手続       呼び出し元
  SUB        MAIN

qa 混合言語プログラミング時の f90_init と f90_io_finish という関数は何ですか?
qa

メインプログラムが Fortran で書かれていない場合には f90_init を C から呼び出す必要があります。
この関数は Fortran の浮動小数点環境の初期化を行うと共に、Fortran の UNIX モジュールがコマンドライン引数にアクセスすることを可能にします。
また、最後には後処理関数 f90_io_finish を呼び出し、バッファをフラッシュしてから処理を終了する必要があります。

一般的に C から Fortran を呼び出す際の C プログラム側の記述は以下の通りです。

int main(int argc, char *argv[])
{
  f90_init(argc, argv); 

  /* ここに Fortran 呼び出し処理を記述する */

  f90_io_finish();

  return 0;
}

qa Fortran 77 のプログラムをコンパイルするには、何らかのコンパイラオプションを指定する必要がありますか?
qa

いいえ、特にコンパイラオプションを指定する必要はありません。

NAG Fortran コンパイラは Fortran 77 の規格を含む Fortran 言語標準に従ってコンパイルを行います。
ただし、ファイルの拡張子によってプログラム形式(固定形式か自由形式か)の区別は行います。
拡張子が *.f, *.for, *.ftn のファイルに対しては固定形式のプログラムとしてコンパイルを行い、拡張子が *.f90, *.f95 のファイルに対しては自由形式のプログラムとしてコンパイルを行います。

補足:
特に、拡張子に関係なく全てのソースファイルを固定形式でコンパイルしたい場合は NAG Fortranコンパイラオプション -fixed を指定してください。
また、拡張子に関係なく全てのソースファイルを自由形式でコンパイルしたい場合は NAG Fortranコンパイラオプション -free を指定してください。

注意:
コンパイラオプション -fixed と -free の両方が指定された場合は -free が優先されます。


qa NAG Fortran コンパイラが私の古い(レガシーな)Fortran 77 のプログラムを受け付けてくれません。
qa

NAG Fortran コンパイラはプログラムが Fortran 言語標準に準拠しているかどうか厳しいチェックを行います。
新たなプログラムを作成する場合これはコンパイラのあるべき姿とも言えますが、昔書かれたプログラム(レガシーコード)をコンパイルしたい場合など厳しいチェックを望まない場合もあります。
このため NAG Fortran コンパイラでは、厳しいチェックを行わないことを指示するためのコンパイラオプションが用意されています。

NAG Fortran コンパイラオプション -dusty を指定してください。
これにより、レガシーコードに良く見られるエラーを警告として扱うようになり、コンパイルが続行できます。

さらに必要であれば NAG Fortran コンパイラオプション -w を指定して警告を出力を抑止することも可能です。


qa Fortran 77 と Fortran 90/95 のソースファイルが混在しているのですが、コンパイルは大丈夫でしょうか?
qa

はい、大丈夫です。

NAG Fortran コンパイラは Fortran 77 の規格を含む Fortran 言語標準に従ってコンパイルを行います。
ただし、ファイルの拡張子によってプログラム形式(固定形式か自由形式か)の区別は行います。
拡張子が *.f, *.for, *.ftn のファイルに対しては固定形式のプログラムとしてコンパイルを行い、拡張子が *.f90, *.f95 のファイルに対しては自由形式のプログラムとしてコンパイルを行います。

補足:
特に、拡張子に関係なく全てのソースファイルを固定形式でコンパイルしたい場合は NAG Fortranコンパイラオプション -fixed を指定してください。
また、拡張子に関係なく全てのソースファイルを自由形式でコンパイルしたい場合は NAG Fortranコンパイラオプション -free を指定してください。

注意:
コンパイラオプション -fixed と -free の両方が指定された場合は -free が優先されます。


qa CDABS(A)、DCMPLX(X,Y)、DCONJG(Z)、DIMAG(Z)、DREAL(Z) はどうすれば利用できますか?
qa

CDABS などの組込み関数は Fortran 言語標準の組込み関数ではありませんが、多くのコンパイラがこれら非標準の組込み関数をサポートしています。

これらの非標準の倍精度複素数組込み手続きを有効にするためにはコンパイラオプション -dcfuns を指定して下さい。


qa 関数 system はありますか?
qa

はい、NAG Fortran コンパイラは多くの POSIX システムコールを独自の組込みモジュールで提供しています。
これらにアクセスするためには、該当するモジュールを use 文により指定する必要があります。
system はモジュール f90_unix_proc においてサブルーチンとして提供されます。
詳細は NAG Fortran コンパイラマニュアル「NAG Fortran Compiler, Release 6.1 マニュアル - 7.8 f90_unix_proc」をご参照ください。

サブルーチン system を利用したプログラム例を以下に示します。

program system_example
  use f90_unix_proc
  call system('echo hello')
end program

qa 関数 getenv はありますか?
qa

はい、NAG Fortran コンパイラは多くの POSIX システムコールを独自の組込みモジュールで提供しています。
これらにアクセスするためには、該当するモジュールを use 文により指定する必要があります。
getenv はモジュール f90_unix_env においてサブルーチンとして提供されます。
詳細は NAG Fortran コンパイラマニュアル「NAG Fortran Compiler, Release 6.1 マニュアル - 7.4 f90_unix_env」をご参照ください。

しかしながら標準準拠の観点からは、Fortran 2003 から導入された組込みサブルーチン get_environment_variable の利用が推奨されます。
組込みサブルーチン get_environment_variable を利用したプログラム例を以下に示します。

program environment_example
!
! This program displays the values of the environment variables FRED and USERNAME
! (if they exist).
!
  implicit none
  call show('FRED')
  call show('USERNAME')
contains
  subroutine show(name)
    character(*), intent(in) :: name
    character(:), allocatable :: value
    integer len, status
    intrinsic get_environment_variable
    call get_environment_variable(name, status=status, length=len)
    if (status == 1) then
      print *, 'Environment variable "', name, '" does not exist.'
    else if (status /= 0) then
      print *, 'Unexpected status', status, 'for environment variable "', name, '"'
    else
      allocate(character(len) :: value)
      call get_environment_variable(name, value=value)
      print *, 'The value of environment variable "', name, '" is "', value, '".'
    end if
  end subroutine
end program

qa 関数 flush はありますか?
qa

はい、NAG Fortran コンパイラは多くの POSIX システムコールを独自の組込みモジュールで提供しています。
これらにアクセスするためには、該当するモジュールを use 文により指定する必要があります。
flush はモジュール f90_unix_io においてサブルーチンとして提供されます。
詳細は NAG Fortran コンパイラマニュアル「NAG Fortran Compiler, Release 6.1 マニュアル - 7.7 f90_unix_io」をご参照ください。

しかしながら標準準拠の観点からは、Fortran 2003 から導入された flush 文の利用が推奨されます。
flush 文を利用したプログラム例を以下に示します。

program slow_dots
!
! This program prints 10 dots, one per second, then finishes.
!
  use iso_fortran_env, only : output_unit
  implicit none
  integer i
  do i = 1, 10
    write (*, '(a)', advance='no') '.'
    call delay
    flush (output_unit)
  end do
  print *, 'Done.'
contains
  subroutine delay
    integer cps,start,now
    intrinsic system_clock
    call system_clock(count=start, Count_Rate=cps)
    if (start == -huge(start)) stop 'No clock.'
    do
      call system_clock(count = now)
      if (now < start .or. now >= start + cps) exit
    end do
  end subroutine
end program

qa 関数 fdate を含むプログラムのコンパイルができません。
qa

関数 fdate は Fortran 言語標準の機能ではありません。
代わりに Fortran 言語標準の組込みサブルーチン date_and_time を以下のプログラム例を参考にご利用ください。

program date_time
  character date*8, time*10 
  call date_and_time(date, time) 
  print *, date, ' ', time 
end program

qa 関数 dtime や etime を含むプログラムのコンパイルができません。
qa

関数 dtime や etime は Fortran 言語標準の機能ではありません。
代わりに Fortran 言語標準の組込みサブルーチン cpu_time や system_clock を以下のプログラム例「代替その1」を参考にご利用ください。
なお「代替その2」はそれぞれ NAG Fortran コンパイラ独自の組込みモジュール f90_unix_env で提供される関数 times を利用したものとなります。

(dtime の代替その1)

real function dtime(time)
  real time(2)
  double precision, save :: last_time = 0
  double precision this_time
  call cpu_time(this_time)
  time(1) = this_time - last_time
  time(2) = 0
  dtime = time(1)
  last_time = this_time
end function

(dtime の代替その2)

real function dtime(time)
  use f90_unix_env, only : tms, times
  real time(2)
  type(tms), save :: lastbuf
  logical :: start = .true.
  type(tms) buffer
  integer junk
  junk = times(buffer)
  if (start) then
    lastbuf%utime = 0
    lastbuf%stime = 0
    start = .false.
  end if
  time(1) = buffer%utime - lastbuf%utime
  time(2) = buffer%stime - lastbuf%stime
  dtime = time(1) + time(2)
  lastbuf = buffer
end function

(etime の代替その1)

real function etime(time)
  real time(2)
  call cpu_time(etime)
  time(1) = etime
  time(2) = 0
end function

(etime の代替その2)

real function etime(time)
  use f90_unix_env, only : tms, times
  real time(2)
  type(tms) buffer
  integer junk
  junk = times(buffer)
  time(1) = buffer%utime
  time(2) = buffer%stime
  etime = buffer%utime + buffer%stime
end function

qa 「TAB 書式入力です(TAB format input)」という警告メッセージが出ます。
qa

TAB 書式は Fortran 言語標準では拡張機能に位置づけられます。
このため、このような警告メッセージが出力されます。
TAB 書式は新しくプログラムを作成する場合には推奨されていない形式です。


qa 「数値データ型にバイト数が指定されました(Byte count on numeric data type)」という警告メッセージが出ます。
qa

integer*2 の様な書式で変数のバイト数を指定する方法は Fortran 言語標準では拡張機能に位置づけられます。
このため、このような警告メッセージが出力されます。

この警告メッセージを抑止したい場合は、NAG Fortran コンパイラオプション -w=x77 を指定してください。

なお NAG Fortran コンパイラでは以下のバイト数指定を受け付けます。

real*4     !単精度実数
real*8     !倍精度実数
complex*8  !単精度複素数
complex*16 !倍精度複素数
logical*1  !1バイト論理
logical*2  !2バイト論理
logical*4  !4バイト論理
logical*8  !8バイト論理
integer*1  !1バイト整数
integer*2  !2バイト整数
integer*4  !4バイト整数
integer*8  !8バイト整数

この書式は新しくプログラムを作成する場合には推奨されていない形式です。
新しくプログラムを作成する場合は、例えば以下のような書き方を推奨します。

integer, parameter :: int8   = selected_int_kind(2)
integer, parameter :: int16  = selected_int_kind(4)
integer, parameter :: int32  = selected_int_kind(9)
integer, parameter :: int64  = selected_int_kind(18)
integer, parameter :: real32 = selected_real_kind(6)
integer, parameter :: real64 = selected_real_kind(15)

などとした上で、例えば 8-bit 整数を使用する場合には以下のようにします。

integer(int8)

また 32-bit(単精度)実数を使用する場合には以下のようにします。

real(real32)

更に定数の指定も、例えば以下のように行うことが可能です。

3.141592653589793238_real64

qa 「KIND 値 (*) が有効な表現方法ではありません(KIND value (*) does not specify a valid representation method)」というエラーが出てプログラムがコンパイルできません。他のコンパイラでは問題なく動いているプログラムです。
qa

コンパイラによって kind 値の解釈が異なるために出ているエラーです。

多くのコンパイラは kind 値がデータバイト数を表す方法(バイト指定)か、もしくは1番から順番に値を割り振る方法(シーケンシャル指定)のどちらかを採用しています。
NAG Fortran コンパイラでは、後者の順番に割り振る方法(シーケンシャル指定)をデフォルトで採用しているため、データバイト数を表す方法(バイト指定)で書かれたプログラムはこのようなエラーとなります。

NAG Fortran コンパイラでは、コンパイラオプションの指定で kind 値にデータバイト数を利用することが可能です。
NAG Fortran コンパイラオプション -kind=byte を指定してください。

移植性を考えたコードを作成する場合には、real(4) などと直接 kind 値の指定を行わずに、例えば real(kind(1.0)) などと kind 組込み関数を利用した表現を推奨します。


qa 「入力バッファにおいてレコードが長すぎます(Record too long for input buffer)」または「出力においてバッファオーバーフローが発生しました(Buffer overflow on output)」というエラーはどういうことでしょうか?
qa

これはファイルバッファの大きさを超えて formatted 入力または出力が行われたことを意味します。
デフォルトのバッファサイズは 1024 文字です。
これをより大きくする場合には open 文で「recl=バッファサイズ」と指定してください。

open (13, file="myfile", form="formatted", recl=2048)

この例では、バッファサイズを 2048 文字に拡張しています。
また、iolength 指定子を inquire 文で指定して recl 指定子に必要なサイズを求める事ができます。

inquire (iolength=irecl) my_big_array
open (13, file="dump", form="formatted", recl=irecl)

この例では、装置 13 に my_big_array を読み書きするのに必要なサイズを設定しています。


qa 「変数 ** のサイズ (*********** バイト) が大きすぎます(Variable ** size of *********** bytes is too big)」というエラーが出てプログラムがコンパイルに通りません。
qa

32-bit 環境で配列の大きさが 2GB を超えているために出ているエラーです。

32-bit 環境での利用可能メモリの上限は通常 2GB となっており、そのためプログラムの作成においても配列の大きさ(の合計)の上限が 2GB までとなります。

このような場合は 64-bit 環境をご検討ください。


qa 実行ファイルを他のマシンで実行しようとするとエラーが出て実行ができません。
(「libf53.* が見つからなかったため、このアプリケーションを開始できませんでした。 ... 」といった意味のエラーが表示されます。)
qa

NAG Fortran コンパイラオプション -unsharedrts を指定して下さい。

このオプション(-unsharedrts)を指定しますと、NAG Fortran コンパイラの実行時ライブラリがスタティック(静的)にリンク(結合)されます。
これにより NAG Fortran コンパイラがインストールされていないマシンにおいても、実行ファイルを実行させることが可能になります。

また、実行時ライブラリをスタティック(静的)にリンク(結合)したくない場合(つまり、このオプション(-unsharedrts)を付けない場合)は、実行ファイルと共に実行時ライブラリが必要となります。


qa 「警告:浮動小数アンダーフローが発生しました(Warning: Floating underflow occurred)」という警告メッセージがプログラムの実行時に出ます。
アンダーフローがどこで発生したかを調べる方法はありますか?
qa

以下に手順を示します。

1. コンパイラモジュールの設定

弊社コンパイラが提供するモジュール

ieee_arithmetic

を use してください。引き続き、サブルーチン

ieee_set_halting_mode(ieee_underflow, .true.) 

を call してください。

2. コンパイラオプションの設定

コンパイラオプション -gline を指定して下さい。

これにより、アンダーフローが発生した時点でプログラムが停止すると共に、停止した行番号が出力されます。
以下にプログラム例を示します。

program underflow
  use ieee_arithmetic
  call ieee_set_halting_mode(ieee_underflow, .true.)
  read *, x
  print *, x / huge(x)
  print *, "Hello World"
end program

このプログラムを実行して 0.1 と入力すると以下のようなメッセージが出力されます。

===
実行時エラー: *** 算術例外 : 浮動小数アンダーフロー - 終了します
main.f95, line 5: エラーが MAIN で発生しました
===

これにより 5 行目でアンダーフローが発生し、プログラムが停止したことが分かります。

注意:
一般的に、アンダーフローは実行結果に対して致命的な影響を及ぼすケースが少ないため NAG Fortranコンパイラでは「警告」としてメッセージを出力しています。
ただし、アンダーフローが実行結果に及ぼす影響度はそのプログラム次第となりますし、また、その影響を重大であると考えるかどうかは解析者(プログラマー)次第となります。


qa 「警告:浮動小数アンダーフローが発生しました(Warning: Floating underflow occurred)」という警告メッセージがプログラムの実行時に出ます。
この警告メッセージの出力を抑止することはできますか?
qa

NAG Fortran コンパイラオプション -no_underflow_warning を指定して下さい。

これにより「警告:浮動小数アンダーフローが発生しました」メッセージの出力を抑止することができます。

注意:
一般的に、アンダーフローは実行結果に対して致命的な影響を及ぼすケースが少ないため NAG Fortranコンパイラ(NAG Fortran Compiler)では「警告」としてメッセージを出力しています。
ただし、アンダーフローが実行結果に及ぼす影響度はそのプログラム次第となりますし、また、その影響を重大であると考えるかどうかは解析者(プログラマー)次第となります。


qa 4倍精度をサポートしていますか?
qa

はい、サポートしています。

NAG Fortran コンパイラが提供するデータ型の詳細は NAG Fortran コンパイラマニュアル「NAG Fortran Compiler, Release 6.1 マニュアル - 2.16 データ型」をご参照ください。

《 補足1: 変数宣言や定数表現について 》

ポータビリティなどを考えると selected_real_kind 組込み関数を用いて、必要な有効桁数を持つ型の kind 番号を取得する方法が推奨されます。
例えば、以下の例のようなモジュールを利用すると便利です。
(なお 0.1q0 といった表現は Fortran 言語非標準であるため、文法エラーとなります。)

プログラム例:

module my_precision
  implicit none
  ! 有効桁数から種別番号を求めるために selected_real_kind を用いる。
  ! 例えば p=5 等とすると単精度 p=15 等とすると倍精度の種別番号が取得される。
  integer, parameter :: wp = selected_real_kind(p=30)
end module my_precision

program precision
  use my_precision
  implicit none
  real(wp) x     ! wp には指定された有効桁数を持つ型の種別番号が格納される。
  complex(wp) c  ! real と complex で種別番号は対応している。
  x = 0.1_wp     ! このような方法で指定種別の定数表現が可能である。
  c = (0.5_wp, 1.2_wp)
  print *, x
  print *, c
end program

出力例(p=5):

  0.1000000
(0.5000000,1.2000000)

出力例(p=15):

  0.1000000000000000
(0.5000000000000000,1.2000000000000000)

出力例(p=30):

.10000000000000000000000000
(0.5000000000000000000000000,1.20000000000000000000000000)

《 補足2: 組込み関数の個別名について 》

Fortran 言語標準では4倍精度に対応した個別名は定義されていません。
(例えば qmax といった組込み関数は Fortran 言語非標準であるため、文法エラーとなります。)
4倍精度に対しては常に総称名(例えば max)をご利用ください。
なお今後は4倍精度に限らず(単精度、倍精度に対しても)個別名は使用しないことが推奨されます。


qa 編集記述子 $(改行抑止)はサポートしていないのですか?
qa

サポートしていません。

編集記述子 $(改行抑止)は Fortran 言語非標準であるため、文法エラーとなります。

Fortran 言語標準では、改行を抑止する場合は write 文において advance='no' という指定を行います。
以下に例を示します。

プログラム例:

program advance_example
  implicit none
  integer age
  write (*, fmt='(a)', advance='no') "Enter your age: " ! 改行なし。
  read *, age
  print *, "Your age is:", age
end program

出力例:

Enter your age: 20
 Your age is: 20

qa Fortran の組込み関数(例えば CDEXP)をコンパイラが認識しません(コンパイルに通りません)。
qa

Fortran 言語標準の組込み関数には総称名(例えば EXP)と個別名(例えば CEXP)があります。
コンパイルに通らない原因としては Fortran 言語非標準の(特定のコンパイラが独自にサポートしている)個別名(例えば CDEXP)の使用が考えれます。

解決策としては、個別名の代わりに総称名をご利用ください。
個別名は特定の精度に対応しますが、総称名はご利用のコンパイラがサポートする全ての精度に対応しており、引数の型と同じ型の戻り値を得ることができます。

Fortran 言語非標準の個別名をリストアップすることは不可能ですが、一般的なルールとして xFUN のような関数の代わりに FUN を使用してください。
ここで x は1文字または複数文字の個別名の接頭辞、FUN は数学関数の名前です。

(良く利用される)数学関数の名前:
ABS, ACOS, ASIN, ATAN, ATAN2, CONJG, COS, COSH, DIM, EXP, LOG, LOG10, MAX, MIN, SIGN, SIN, SINH, SQRT, TAN, TANH

(典型的な)個別名の接頭辞:
C, CD, CQ, D, DC, Q, Z

例えば、個別名 CEXP, DEXP, CDEXP, DCEXP, QEXP, CQEXP, ZEXP はどれも総称名 EXP に置き換えても同じ結果を得ることができます。

いくつかの組込み関数については、ルールが若干異なります。
xINT, xNINT(ここで x は上述した個別名の接頭辞)は、AINT, ANINT に置き換えてください。

接頭辞 C または D で始まる個別名の中には Fortran 言語標準の個別名(例えば CEXP)もあることに注意してください。
しかし、いずれにせよ(総称名の代わりに)個別名を用いるべき理由は特にありません。

Privacy Policy | Trademarks