IT pass HikiWiki - [itbase2020]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 <- 結果は倍精度実数型
上の結果からわかる通り,
* 整数型と実数型の演算の結果は実数型
* 実数型と倍精度実数型の演算の結果は倍精度実数型
* 倍精度実数型と整数型の演算の結果は倍精度実数型
となります.
上の例は, 掛け算ですが, 四則演算ではすべて上のようになります.
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 <- 結果は倍精度実数型
上の結果からわかる通り,
* 整数型と実数型の演算の結果は実数型
* 実数型と倍精度実数型の演算の結果は倍精度実数型
* 倍精度実数型と整数型の演算の結果は倍精度実数型
となります.
上の例は, 掛け算ですが, 四則演算ではすべて上のようになります.