4

私は大きな数(〜10 ^ 14)で作業しようとしていますが、それらを保存してその長さのループを反復できる必要があります。

n=SOME_BIG_NUMBER
do i=n,1,-1

通常のスター表記などを試してみましたkind=8が、何もうまくいかないようです。次に、huge組み込み関数とコードを確認しました。

program inttest

print *,huge(1)
print *,huge(2)
print *,huge(4)
print *,huge(8)
print *,huge(16)
print *,huge(32)

end program inttest

すべての場合で数値 2147483647 が生成されます。どうしてこれなの?64 ビット マシンで gfortran (f95) を使用しています。

bignum ライブラリが必要な場合、どのライブラリが提案されますか?

4

3 に答える 3

9

私が使用している Mac 上の gfortran バージョン 4.3、4.4、および 4.5 は、8 バイト整数をサポートしています。Fortran >= 90 で変数の型を選択する最善の方法は、組み込み関数を使用して必要な精度を指定することです。試す:

integer, parameter :: LargeInt_K = selected_int_kind (18)
integer (kind=LargeInt_K) :: i, n

少なくとも 18 桁の 10 進数を取得します。これは通常、8 バイトの整数になります。

gfortran 4.3 では、huge (1_LargeInt_K) は 9223372036854775807 を出力します。huge (1) などを記述したとき、デフォルトでは、定数はデフォルトの整数でした。ここでは、huge が 2147483647 を返したため、明らかに 4 バイトです。変数だけでなく、定数 - より一般的には、デフォルトで単精度に設定されている実定数の有効数字を失うと、これは人々をつまずかせます。

Fortranも参照してください: integer*4 vs integer(4) vs integer(kind=4)

通常、gfortran のコマンド名は gfortran です。f95 は別のコンパイラでしょうか? 「gfortran -v」と「f95 -v」を試してください。

于 2010-07-08T15:03:53.943 に答える
8

関数の正確な定義を誤解していHUGEます。 HUGE(num)と同じ種類と型の最大数を返しますnum。返される値の種類と型も と同じnumです。すべての入力値は (デフォルト) integersHUGEであるため、正しく、最大のデフォルト サイズの整数を返します。

HUGE(num)で最大の整数を返しませんkind=num。また、バイトHUGE(num)で表現可能な最大数も返しません。num多くのコンパイラは4 バイトおよび 8 バイトの整数にinteger(kind=4)and integer(kind=8) etcを使用しますが、これは言語標準によって保証されておらず、移植性に依存することはできません。

@MSBの答えは、あなたが望むことをする方法を教えてくれます.

于 2010-07-08T15:15:06.423 に答える
0

要約:コンパイラー・オプションを検討することを検討してください。

FORTRANをやってから久しぶりで、HUGE()を使ったのを覚えていませんが、少し見てみました。私のIntelLinuxマシンにはgfortran4.1.2があります。64ビット整数で機能させるには、-fdefault-integer-8オプションをオンにしてコンパイルする必要があることがわかりました。具体的には、このコードで:

      program inttest
      print *, huge(1)
      end program inttest

ランニング

$ gfortran inttest.for

以下を印刷する実行可能ファイルを作成しました:

2147483647

ただし、実行中:

$ gfortran -fdefault-integer-8 inttest.for

結果として、次の出力を提供する実行可能ファイルが生成されました。

9223372036854775807

また、変数をinteger * 8として宣言し、-fdefault-integer-8オプションなしでコンパイルすると、エラーが発生しました。コード:

  program inttest2
  integer*8  test_int
  test_int = 9223372036854775807
  print *, test_int
  end program inttest2

ランニング

$ gfortran inttest2.for

をもたらしました

ファイルinttest.for:4内

  test_int = 9223372036854775807  
                               1 

エラー:(1)の種類に対して整数が大きすぎます

ただし、-fdefault-integer-8オプションを使用してコンパイルし、実行可能ファイルを取得すると、問題なく動作しました。

9223372036854775807

役に立つと思われる他のgfortranオプションがあるかもしれませんが、私はそれ以上調査しませんでした。

確かに、これでも10 ^ 14は得られませんが、見た結果を説明するのに役立つ場合があります。

于 2010-07-08T15:40:02.853 に答える