Fortran-numbers

提供:Dev Guides
移動先:案内検索

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