Fortran-numbers
Fortran-数値
Fortranの数は3つの組み込みデータ型で表されます-
- 整数型
- リアルタイプ *複合型
整数型
整数型は整数値のみを保持できます。 次の例では、通常の4バイト整数で保持できる最大値を抽出します-
program testingInt
implicit none
integer :: largeval
print* , huge(largeval)
end program testingInt
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
2147483647
- huge()関数は、特定の整数データ型が保持できる最大数を与えることに注意してください。 *kind 指定子を使用してバイト数を指定することもできます。 次の例はこれを示しています-
program testingInt
implicit none
!two byte integer
integer(kind = 2) :: shortval
!four byte integer
integer(kind = 4) :: longval
!eight byte integer
integer(kind = 8) :: verylongval
!sixteen byte integer
integer(kind = 16) :: veryverylongval
!default integer
integer :: defval
print *, huge(shortval)
print *, huge(longval)
print *, huge(verylongval)
print *, huge(veryverylongval)
print *, huge(defval)
end program testingInt
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
32767
2147483647
9223372036854775807
170141183460469231731687303715884105727
2147483647
リアルタイプ
2.0、3.1415、-100.876などの浮動小数点数を格納します。
従来、2つの異なる real 型がありました。デフォルトのreal型と double precision 型です。
ただし、Fortran 90/95では、 kind 指定子を使用して、実データ型と整数データ型の精度をより詳細に制御できます。これについては、後ほど説明します。
次の例は、実際のデータ型の使用を示しています-
program division
implicit none
! Define real variables
real :: p, q, realRes
! Define integer variables
integer :: i, j, intRes
! Assigning values
p = 2.0
q = 3.0
i = 2
j = 3
! floating point division
realRes = p/q
intRes = i/j
print *, realRes
print *, intRes
end program division
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
0.666666687
0
複合型
これは、複素数を格納するために使用されます。 複素数には、実部と虚部の2つの部分があります。 2つの連続した数値ストレージユニットは、これら2つの部分を格納します。
たとえば、複素数(3.0、-5.0)は3.0 – 5.0iに等しい
汎用関数* cmplx()*は複素数を作成します。 入力引数のタイプに関係なく、実部と虚部が単精度である結果を生成します。
program createComplex
implicit none
integer :: i = 10
real :: x = 5.17
print *, cmplx(i, x)
end program createComplex
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
(10.0000000, 5.17000008)
次のプログラムは、複素数演算を示しています-
program ComplexArithmatic
implicit none
complex, parameter :: i = (0, 1) ! sqrt(-1)
complex :: x, y, z
x = (7, 8);
y = (5, -7)
write(*,*) i *x* y
z = x + y
print *, "z = x + y = ", z
z = x - y
print *, "z = x - y = ", z
z = x *y
print* , "z = x *y = ", z
z = x/y
print* , "z = x/y = ", z
end program ComplexArithmatic
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
(9.00000000, 91.0000000)
z = x + y = (12.0000000, 1.00000000)
z = x - y = (2.00000000, 15.0000000)
z = x * y = (91.0000000, -9.00000000)
z = x/y = (-0.283783793, 1.20270276)
数値の範囲、精度、サイズ
整数の範囲、浮動小数点数の精度とサイズは、特定のデータ型に割り当てられたビット数に依存します。
次の表は、整数のビット数と範囲を示しています-
Number of bits | Maximum value | Reason |
---|---|---|
64 | 9,223,372,036,854,774,807 | (2**63)–1 |
32 | 2,147,483,647 | (2**31)–1 |
次の表は、ビット数、最小値と最大値、および実数の精度を示しています。
Number of bits | Largest value | Smallest value | Precision |
---|---|---|---|
64 | 0.8E+308 | 0.5E–308 | 15–18 |
32 | 1.7E+38 | 0.3E–38 | 6-9 |
次の例はこれを示しています-
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e+40
y = 3.73e+40
z = x *y
print* , z
end program rangePrecision
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
x = 1.5e+40
1
Error : Real constant overflows its kind at (1)
main.f95:5.12:
y = 3.73e+40
1
Error : Real constant overflows its kind at (1)
今、私たちはより小さい数を使用しましょう-
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e+20
y = 3.73e+20
z = x *y
print* , z
z = x/y
print *, z
end program rangePrecision
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
Infinity
0.402144760
アンダーフローを見てみましょう-
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e-30
y = 3.73e-60
z = x *y
print* , z
z = x/y
print *, z
end program rangePrecision
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
y = 3.73e-60
1
Warning : Real constant underflows its kind at (1)
Executing the program....
$demo
0.00000000E+00
Infinity
種類指定子
科学プログラミングでは、作業が行われているハードウェアプラットフォームのデータの範囲と精度を知る必要があります。
組み込み関数* kind()*を使用すると、プログラムを実行する前にハードウェアのデータ表現の詳細を照会できます。
program kindCheck
implicit none
integer :: i
real :: r
complex :: cp
print *,' Integer ', kind(i)
print *,' Real ', kind(r)
print *,' Complex ', kind(cp)
end program kindCheck
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
Integer 4
Real 4
Complex 4
また、すべてのデータ型の種類を確認することができます-
program checkKind
implicit none
integer :: i
real :: r
character :: c
logical :: lg
complex :: cp
print *,' Integer ', kind(i)
print *,' Real ', kind(r)
print *,' Complex ', kind(cp)
print *,' Character ', kind(c)
print *,' Logical ', kind(lg)
end program checkKind
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
Integer 4
Real 4
Complex 4
Character 1
Logical 4