【Fortran】宣言文,有効桁数の精度

Fortran基礎として、本記事では、宣言文・有効桁数の精度についてまとめておく。なお、本記事の1つ目の目的として、モリソン式による波力計算をfortranで作成できるようになることとする。モリソン式の波力計算には、基本的な四則計算に加え、絶対値、三角関数、収束計算が含まれているため、これを作成することができれば、基本的な数値計算プログラムに関する知識は身につくと思う。

1. 宣言文

Fortranでは、整数型、実数型、文字型を宣言する必要がある。また、宣言文には2種類あり、暗黙の了解に従う場合と従わない場合がある。この暗黙の了解とは、アルファベットa~h、o~zを実数、i~nを整数としている。

①暗黙の了解に従わない場合:implicit none

program implicit
implicit none
real*8  :: a,b
integer :: i
character*10 test

  a    = 0.1
  b    = 0.2
  i    = 1.0
  test = 'test'
end program

ここで、
real*8:実数型,倍精度
integer:整数
character*10:文字,文字数が10文字以内(文字数は変更可能) 
暗黙の了解に従わない場合、一つ一つ宣言しなければならない。

②暗黙の了解に従う場合:implicit real*8(a-h, o-z )

program implicit
implicit real*8(a-h,o-z)
character*10 test

  a    = 0.1
  b    = 0.2
  i    = 1.0
  test = 'test'
end program

 本記事含め、今後は暗黙の了解に従って作成する。implicit noneでも問題はないが、計算量が増えたとき、一つ一つ宣言しなければならないのは手間であるし、宣言漏れがあればエラーになる。
 なお、複素数を用いる場合は複素数型は別で宣言する必要があり、以下にそれを示す。

program implicit
implicit real*8(a,b,d-h,o-z),complex*8(c)
character*10 test

  a    = 0.1
  b    = 0.2
  i    = 1.0
 ci  = (0.0,1.0)
  test = 'test'
end program

ここで、
complex*8(c):頭文字に「c」と付いている文字列は複素数(実部,虚部)

2. 有効桁数の精度

 Fortranにおける実数型(複素数型含む)は実数の近似値として処理される。これは、10進数を2進数にして処理しようとしているために起こってしまう。十分な精度で実数を表現したい場合、以下のように宣言文を書き換えると精度を向上させることができる。
※倍精度にするときは、数値に「d0」をつける。

real*4:単精度,有効数字約7桁
a = 0.1としたとき、a = 0.100000001490116119384765625000000000

real*8:倍精度,有効数字約16桁
a = 0.1d0としたとき、a = 0.100000000000000005551115123125782702

real*16:倍々精度,有効数字約30桁
a = 0.1d0としたとき、a = 0.100000000000000005551115123125782702

単精度の有効数字7桁では、誤差が生じる不安があるため、倍精度で計算することを推奨する。

次回

入出力とフォーマットについて。


この記事が気に入ったらサポートをしてみませんか?