IT pass HikiWiki - [itbase2019]Fortran 実習 演算 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

= 演算

Fortran では様々な演算のために, 予め演算子と組み込み関数が用意されています.
プログラムを作って計算してみましょう.

== 演算子と関数

Fortran で用意されている演算子は下のようなものです.

# RT
  delimiter = %

演算子% 意味% 用例
+ % 足す % x+y
- % 引く % x-y
* % 掛ける % x * y
/ % 割る % x / y
** % べき乗 % x**y (x の y 乗)
= % 代入 % x = y (x に y の値を代入)


また, Fortran で用意されている関数は下のようなものです.

# RT
  delimiter = %

関数% 意味% 備考
sin(x) % 正弦 (sine) % x の単位は radian
cos(x) % 余弦 (cosine) % x の単位は radian
tan(x) % 正接 (tangent) % x の単位は radian
asin(x) % 逆正弦 (arcsine) % 出力の単位は radian
acos(x) % 逆余弦 (arccosine) % 出力の単位は radian
atan(x) % 逆正接 (arctangent) % 出力の単位は radian
sqrt(x) % 平方根 %
exp(x) % 指数関数 %
log(x) % 自然対数 %
log10(x) % 10 を底とする対数 %
mod(x,y) % x を y で割った余り %
abs(x) % x の絶対値 %
max(x1,x2,...) % x1, x2, ... の最大値 %
min(x1,x2,...) % x1, x2, ... の最小値 %
int(x) % 整数への変換 (切り捨て) %
nint(x) % 整数への変換 (四捨五入) %
real(x) % 実数への変換 %
dble(x) % 倍精度実数への変換 %
cmplx(x) % 複素数への変換 %
len(a) % 文字列長 % a は文字型変数
len_trim(a) % 後ろの空白を除いた文字列長 % a は文字型変数
trim(a) % 後ろの空白を除く % a は文字型変数

では, 上の演算子や関数を使って計算してみましょう.

下のようなプログラムを calc.f90 というファイル名で作成しましょう.

  program calc

    implicit none

    real, parameter :: pi = 3.141592            ! 円周率

    print *, "sin & cos: ", sin( 0.0 ), sin(pi/2.0), cos(pi)
    print *, "**       : ", 2**5, 2**0.5
    print *, "int, real: ", int( 2.5 ), real( 2 )
    print *, "sqrt     : ", sqrt( 2.0 )
    print *, "exp      : ", exp( 2.0 )
    print *, "log      : ", log( 100.0 ), log10( 100.0 )
    print *, "mod      : ", mod( 10, 3 )

  end program calc

コンパイルして実行してみましょう.

  $ gfortran -o calc calc.f90                 <- コンパイル
  $ ./calc                                    <- 実行
   sin & cos:    0.00000000       1.00000000      -1.00000000
   **       :           32   1.41421354
   int, real:            2   2.00000000
   sqrt     :    1.41421354
   exp      :    7.38905621
   log      :    4.60517025       2.00000000
   mod      :            1

それぞれの演算の意味を確認してみてください.


== 異なる型同士の演算

異なる型の変数同士の演算を行うと, 結果はどの型になるでしょうか?

下のプログラムを試してみましょう.

  program calcmix

    implicit none

    integer       :: num
    real          :: val4
    real(8)       :: val8

    num      = 3
    val4     = 1.2
    val8     = 1.2d0

    print *, "integer          :", num
    print *, "real             :", val4
    print *, "real(8)          :", val8
    print *, "integer * real   :", num * val4
    print *, "real    * real(8):", val4 * val8
    print *, "integer * real(8):", num * val8

  end program calcmix

コンパイルして実行してみましょう.

  $ gfortran -o calcmix calcmix.f90                 <- コンパイル
  $ ./calcmix                                       <- 実行
  integer          :           3
  real             :   1.20000005
  real(8)          :   1.2000000000000000
  integer * real   :   3.60000014                   <- 結果は実数型
  real    * real(8):   1.4400000572204590           <- 結果は倍精度実数型
  integer * real(8):   3.5999999999999996           <- 結果は倍精度実数型

上の結果からわかる通り,
* 整数型と実数型の演算の結果は実数型
* 実数型と倍精度実数型の演算の結果は倍精度実数型
* 倍精度実数型と整数型の演算の結果は倍精度実数型
となります.
上の例は, 掛け算ですが, 四則演算ではすべて上のようになります.