12

Fortranは私にとってまったく新しいものですが、次の問題を解決するのを誰かが助けてくれますか?私のPCで、すべての整数の種類番号と、各種類番号の最大値と最小値を調べたいと思います。私は以下にリストされたコードを持っています:

program intkind
implicit none

integer :: n=1
integer :: integer_range =1


do while(integer_range /= -1)
    print*, "kind_number ", selected_int_kind(n)
    call rang(integer_range)
    n = n *2
    integer_range = selected_int_kind(n)
end do

contains
subroutine rang(largest) 
    integer largest
    print*, huge(largest)

end subroutine

end 

私が得る整数の種類の数は:1、2、4、8です。

  1. 各種類の数値の最大の整数が同じであるのはなぜ2147483647ですか。そして、最小の整数の組み込み関数はありますか?

  2. サブルーチンが呼び出されたときに整数の種類番号を保持するにはどうすればよいrangですか?それが最大の整数の鍵だと思います。

4

2 に答える 2

18

あなたのサブルーチン:

subroutine rang(largest) 
    integer :: largest
    print *, huge(largest)
end subroutine

デフォルトサイズの整数を入力として取り、そのデフォルトサイズの整数に収まる最大の値を出力します。これは常にhuge (デフォルトの整数) を返しますが、ほとんどのシステムでは huge (4 バイトの整数) または 2147483647 hugeです。変数の型のみを考慮します。変数はまったく解釈されません。上記でやろうとしていることを実行できる唯一の方法は、パラメータ化された派生型を使用することです。これは十分に新しいため、コンパイラでのサポートはまだ少しむらがあります。

INTEGER のさまざまな KIND の範囲を調べたい場合は、さまざまな変数を使用する必要があります。

program integerkinds
    use iso_fortran_env
    implicit none

    integer :: i
    integer(kind=int8)  :: i8
    integer(kind=int16) :: i16
    integer(kind=int32) :: i32
    integer(kind=int64) :: i64

    integer(kind=selected_int_kind(6)) :: j6
    integer(kind=selected_int_kind(15)):: j15

    print *,'Default:'
    print *, huge(i)
    print *,'Int8:'
    print *, huge(i8)
    print *,'Int16:'
    print *, huge(i16)
    print *,'Int32:'
    print *, huge(i32)
    print *,'Int64:'
    print *, huge(i64)

    print *,''

    print *,'Selected Integer Kind 6:'
    print *, huge(j6)

    print *,'Selected Integer Kind 15:'
    print *, huge(j15)

end program integerkinds

実行すると次のようになります。

$ ./intkinds
 Default:
  2147483647
 Int8:
  127
 Int16:
  32767
 Int32:
  2147483647
 Int64:
  9223372036854775807

 Selected Integer Kind 6:
  2147483647
 Selected Integer Kind 15:
  9223372036854775807
于 2012-03-05T16:10:37.517 に答える