1program sample
2 implicit none
3
4 real(8) :: x, y, z
5
6 x = 4.0_8
7 y = 6.0_8
8
9 ! 平均値を計算してzに代入
10 z = 0.5_8 * (x + y)
11 write(*, *) z
12
13 ! x, yが倍精度なので2も倍精度に変換されてから演算が実行される
14 z = (x + y) / 2
15 write(*, *) z
16
17 ! 以下の代入文は意図した通りに動かない
18 ! 右辺は整数同士の演算なので0となり, それが代入時に実数型に変換される
19 z = 2 / 3
20 write(*, *) z
21
22 ! 右辺は単精度実数として演算されてから倍精度実数に変換されるので精度が落ちる
23 z = 2 / 3.0
24 write(*, *) z
25
26 ! 右辺も倍精度実数として演算される(期待通りの結果)
27 z = 2 / 3.0_8
28 write(*, *) z
29
30 ! 明示的に変換する
31 z = real(2, kind=8) / real(3, kind=8)
32 write(*, *) z
33
34 ! kindを指定しないと右辺の演算は単精度で評価されてしまう
35 z = real(2) / real(3)
36 write(*, *) z
37
38 stop
39endprogram sample