2章:Fortran90プログラミング基礎
2.3 演算と関数
ここでは、数値演算と文字演算で使用する関数について説明する。
2.3.1 数値演算
Fortran では、よく使われる数学上の演算や関数に対応するさまざまな関数が用意されている。主な数値演算の関数には以下のようなものがある。
関数 | 説明 |
---|---|
ABS(X) | 絶対値を求める |
SQRT(X) | 平方根を計算する |
MOD(A,B) | AをBで割った余りを求める |
MAX(A,B,・・・) | A、B、・・・の最大値を求める |
MIN(A,B,・・・) | A、B、・・・の最小値を求める |
EXP(X) | 指数を計算する |
LOG(X) | 自然対数を計算する |
SIN(X) | xラジアンのサイン(正弦)を計算する |
COS(X) | xラジアンのコサイン(余弦)を計算する |
TAN(X) | xラジアンのタンジェント(正接)を計算する |
引数のところには式を書くこともできる。
(例)
W=SIN(A+B)-COS(A-B)
数値演算の演算規則は、実数型も整数型も通常の計算と同じだが、実数型の演算は一定の桁数による近似計算になる。
整数型の演算は、除算結果の小数点以下が切り捨てられる。
(例)
3/5=0
11/(-3)=-3
整数型の定数、変数と実数型の定数、変数の間の演算は、整数が実数に変換されてから演算が行われる。
(例)
5+1.8 は 5.0+1.8 に変換 → 結果の値は6.8となる
6.0/8 は 6.0/8.0 に変換 →結果の値は0.75となる
整数型と実数型の演算には以下のような規則がある。
- 型の違う変数に代入した場合は、代入先の変数の型になる。
- 1つの式に整数型と実数型を混ぜて使った場合は、実数型になる。
このように異なる型が含まれる式を型混合式という。 - 型変換の関数を利用して、型を変換することもできる。
関数 | 説明 |
---|---|
INT(X) | 整数型への変換(切捨て) |
NINT(X) | 整数型への変換(四捨五入) |
REAL(X) | 実数型への変換 |
FLOAT(X) | 実数型への変換 |
(例)上底をU、下底をD、高さHを読み込み、台形の面積Sを求める。
PROGRAM REI2_3
IMPLICIT NONE
REAL : : U,D,H,S
READ(*,*) U,D,H
S=(U+D)H/2.0 !台数の面積を求める公式
WRITE(*,*) S
STOP
END PROGRAM REI2_3
(例)x の値を読み込み、y = 4x3 + 3x2 + 7x - 1 を計算する。
PROGRAM REI2_4
IMPLICIT NONE
REAL : : X,Y
WRITE(*,*) ’x=’
READ(*,*) X
Y=((4.0*X+3.0)*X+7.0)*X-1.0 !計算式
WRITE(*,*) ’Y=’,Y
STOP
END PROGRAM REI2_4
y = 4x3 + 3x2 + 7x - 1 という式は、y = ((4x+3)x+7)x - 1 という形にする。
(例)円柱の半径 r と高さ h を読み込み、その円柱の体積 V と表面積 S を求める
PROGRAM REI2_5
IMPLICIT NONE
REAL : : R,H,V,S
WRITE(*,*) ’R=’
WRITE(*,*) ’H=’
READ(*,*) R,H
V=3.14159*R**2*H !円柱の体積を求める
S=2*3.14159*R*(R+H) !円柱の表面積を求める
WRITE(*,*) ’V=’,V
WRITE(*,*) ’S=’,S
STOP
END PROGRAM REI2_5
円柱の体積 V は、V = πr2h
表面積 S は、S = 2πr2 + 2πrh なので 2πr(r+h) という形にする。
円周率πの値として、その近似値3.14159を用いる。
2.3.2 文字演算と関数
文字列に対して使用される主な演算には、連結、部分列、比較がある。
■連結演算
「//」という連結演算子を使って、2つ以上の文字列を連結する。
(例)
"time" // "keeper"
の結果は
"timekeeper"
という文字列になる。
■部分列
ある文字列のある部分にアクセスすること。変数Aの文字列 S 文字目から E 文字目までの部分列を、A(S:E)で表す。S を省略すると「先頭から」、E を省略すると「最後まで」の意味になる。
(例)
A="BIRTHDAY"
の場合、
A(2:7)の値は"IRTHDA"
A(:5)の値は"BIRTH"
A(6:)の値は"DAY"
となる。
■比較
演算子を用いて、2つの文字列を比較する。演算子は、= = /= < <= > =>。
演算子 | 説明 |
---|---|
= = または .EQ. | 2つの文字列が一致すると「等しい」と判断される |
/= または .NE. | 2つの文字列が一致しなければ「正しくない」と判断される |
< または .LT. | 左の文字が右の文字よりも小さい |
<=または .LE. | 左の文字が右の文字よりも小さい、または等しい |
> または .GT. | 左の文字が右の文字よりも大きい |
または .GE. | 左の文字が右の文字よりも大きい、または等しい |
文字の大小は、種別によって以下のように判断される。
・英字:ABC 順
・カナ文字:50音順
・数字:値の順
種別単位で見た場合の大小は文字コードによって異なる。
・ASCII コード(JIS コード):数字<英字<カナ文字
・EBCDIC コード:カナ文字<英字<数字
文字演算の関数には以下のようなものがある。
関数 | 説明 |
---|---|
ACHAR(X) | ASCIIコードの大小順序で、指定した番号の文字を求める |
ADJUSTL(X) | 文字列を左詰めにする |
ADJUSTR(X) | 文字列を右詰めにする |
CHAR(X) | コンパイラの大小順序で、指定した番号の文字を求める |
ICHAR(X) | コンパイラの大小順序で、文字の番号を求める |
INDEX(X) | 部分列の開始位置を求める |
LEN_TRIM(X) | 行末の空白を除いた文字の長さを求める |
LGE(A,B) | 2つの引数の辞書順を求める(以上) |
LGT(A,B) | 2つの引数の辞書順を求める(より大きい) |
LLE(A,B) | 2つの引数の辞書順を求める(以下) |
LLT(A,B) | 2つの引数の辞書順を求める(より小さい) |
REPEAT(A,B) | 繰返し文字を連結する |
SCAN(X) | 集合の中の文字に対して文字列を検索する |
TRIM(X) | 行末の空白を削除する |
VERIFY(X) | 集合の中の文字に対して包含の検査する |
(例)2つの文字列を変数 A、変数 B として読み込み、両方の最初の2文字を変数 A、B の順に連結して表示する。
PROGRAM REI2_6
IMPLICIT NONE
INTEGER : : A,B
CHARACTER(4) : : W
READ(*,*) : : A,B
W=A(1:2)//B(1:2) !変数Aの最初の2文字と、変数Bの最初の
2文字を連結して、Wに代入する。
WRITE(*,*) : : W
STOP
END PROGRAM REI2_6
変数 A に stock、変数 B に operate と入力した場合、
表示される値 W は
stop
と表示される。