60

私は Fortran を学ぼうとしていますが、多くの異なる定義が渡されているのを見て、それらが同じことを達成しようとしているのだろうかと思っています。次の違いは何ですか?

  • integer*4
  • integer(4)
  • integer(kind=4)
4

3 に答える 3

63

Fortran >=90 では、組み込み関数を使用して必要な精度を指定するのが最善の方法です。これにより、移植性と必要な精度の両方が保証されます。たとえば、少なくとも 8 桁の 10 進数をサポートする整数を取得するには、次のように使用できますimy_int

integer, parameter :: RegInt_K = selected_int_kind (8)
integer (kind=RegInt_K) :: i, my_int

RegInt_K(または選択した名前) を として定義parameterすると、コード全体でシンボルとして使用できます。これにより、精度の変更も容易になります。

8 桁または 9 桁の 10 進数を要求すると、通常は 4 バイトの整数が取得されます。

integer*4は、古い FORTRAN に戻って 4 バイト整数を指定する一般的な拡張です。ただし、この構文は標準の Fortran ではありません。

integer (4)orはorinteger (RegInt_K)の略です。 と同じではなく、移植性もありません。言語標準では、種類の数値が指定されていません。ほとんどのコンパイラはを 4 バイト整数に使用しますが、これらのコンパイラでは同じ整数型を提供しますが、例外があるため、移植性がなく、避けるのが最善です。integer (kind=4)integer (kind=RegInt_K)integer (4)integer*4kind=4integer*4integer(4)integer(4)

実数のアプローチも同様です。

更新: 必要な精度で数値型を指定するのではなく、使用するストレージで数値型を指定する場合、Fortran 2008 はメソッドを提供します。use実数と整数は、モジュールを ing した後のストレージのビット数で指定できますISO_FORTRAN_ENV。たとえば、4 バイト (32 ビット) の整数の場合:

use ISO_FORTRAN_ENV
integer (int32) :: MyInt

gfortran マニュアルには、「組み込みモジュール」の下にドキュメントがあります。

于 2010-07-03T05:41:19.790 に答える
28

種類が何であるかをもう1つ明確に説明します。コンパイラには、さまざまな数値型のテーブルがあります。すべての整数型は、基本型の異なる種類integerです -- 。コンパイラには、1 バイト、2 バイト、4 バイト、8 バイト、および 16 バイトinteger(またはreal) の種類があるとします。テーブルでは、コンパイラはこの種類のそれぞれに対するインデックスを持っています。このインデックスは種類番号です。

多くのコンパイラは、次の番号付けを選択します。

kind number    number of bytes
1              1
2              2
4              4
8              8
16             16

ただし、他の番号付けを選択することもできます。明らかな可能性の1つは、

kind number    number of bytes
1              1
2              2
3              4
4              8
5              16

実際、このアプローチを選択するコンパイラ (少なくとも g77 と NAG) があります。これを変更するオプションもあります。したがってkind、数値は移植性がなく、コンパイラによっては 4 バイト整数または 8 バイト整数を意味しますinteger(kind=4)integer(4)

integer*4常に4バイトを意味するという意味で移植可能です。しかし一方で、これはどの標準にも含まれていないため、移植性がありません。この表記法を使用するプログラムは、Fortran 77、90、またはその他の Fortran では有効ではありません。

正しいオプションを確認するには、種類番号を設定する方法を MSB の回答を参照してください。

同じ概念がrealデータ型にも当てはまります。Fortran 90 の種類のパラメーター(mataap の回答)を参照してください。

于 2014-07-24T07:41:41.060 に答える