4

integer(16)変数を使用すると、 を使用するprintと、出力に予想される正確な数のスペースが含まれることに注意しました。したがって、私が使用するとき(ここでプロジェクトオイラーの問題を認識する人もいるかもしれません)

    implicit none
    integer(16)::sum_sq,sq_sum,diff,i
    sum_sq=0;sq_sum=0;
    do i=1,100
       sum_sq=sum_sq+i*i
       sq_sum=sq_sum+i
    enddo
    diff=abs(sq_sum**2-sum_sq)
    print *, "The difference is", diff

私は得る

The difference is 25164150

出力として、または変数にinteger(8)orを使用すると、integer

The difference is             25164150

出力として。これは、フラグの有無にかかわらず、gfortran でのみ発生します (私の ifort は、対処すべき別の問題である-m64を受け入れないようですが、 のスペースを含む出力を返します)。kind=16integer(8)

なぜこれが起こるのか誰にも分かりますか?

4

3 に答える 3

6

すでに回答されているように、リスト指向の IO を使用していますが、これは便利ですが、言語標準によって完全に指定されているわけではありません。だから、あなたは特異性を見つけるでしょう。出力を制御したい場合は、フォーマットを使用する必要があります。また、項目を出力するために必要な最小桁数を使用するフォーマット指定子「I0」も便利です。

副次的な問題として、「整数 (N)」は N バイトの整数であることが保証されていません。これは、言語標準の一部ではない "integer*N" と同じではありません。多くのコンパイラは、種類の値に型のバイト数を使用しますが、例外があります。後から考えると、整数値を使用して整数、実数、および論理サブタイプを指定するのは誤りでした。バイト数で型を選択したい場合は、Fortran 2003 以降の方法があります。Fortran 2003 の ISO_C_Binding モジュールは、C_INT32_T、C_INT64_T、C_INT128_T などの型指定子を提供します。Fortran 2008 の ISO_FORTRAN_ENV モジュールは、INT8、INT16、INT32、および INT64 を提供します。

于 2012-08-05T05:22:17.220 に答える
6

これは、出力にデフォルトのフォーマットを使用しているために発生します。

print*は と同等ですwrite(unit=*,fmt=*)。ここfmt=*で、出力にデフォルトのフォーマットを使用することを意味します。これは、コンパイラに依存する場合があります。デフォルトの書式設定では、値に基づく調整を行わずに、出力されるデータ型が必要とする可能性があるだけのスペースを使用します。

次のコードを検討してください。

integer(kind=4) :: a ! short integer for my compiler
integer(kind=8) :: b ! long integer for my compiler

a = 23
b = huge(a)

print*,a       ! small value, short integer, we expect spaces
print*,huge(a) ! maximum value, short integer, we expect no spaces
print*,huge(b) ! maximum value, long integer, we expect no spaces
print*,b       ! medium lenght value, long integer, we expect spaces

end

gfortran でコンパイルすると、出力は次のようになります。

          23
  2147483647
  9223372036854775807
           2147483647

最初の行は、4 バイト整数表現の小さな数値です。可能な最大サイズまで埋めるスペースに注意してください。2 行目は、4 バイト整数が取り得る最大値です。出力にぴったりと収まり、スペースはありません。3 行目は 8 バイト整数の最大値です。ぴったりとフィットします。4 行目は 2 行目と同じ値ですが、8 バイトの整数表現です。スペースに注意してください。

これは、デフォルトの書式設定で出力にスペースが表示される理由を説明しています。あなたの質問に正確に答えるわけではありません.4倍精度の整数の出力にスペースがないのはそのためです. 知らない。私のコンパイラ ( pgf90 10.6-0ifort 12.0.2.137gfortran 4.5.1) はどちらも 4 倍精度の整数をサポートしていません。コンパイラハッカーの可能性があります。誰かがこの部分についてもっと経験を積んでいるかもしれません。

于 2012-08-05T04:54:49.673 に答える
4

リスト指示出力はプロセッサ固有です (Fortran 標準では、通常「コンパイラ」と呼ばれるものを「プロセッサ」と呼ぶことに注意してください)。Fortran 90 標準では、リスト出力について次のように規定されています。

10.8.2 リスト指示出力

...

整数出力定数は、Iw編集記述子の効果で生成されます。

実定数は、値の大きさと範囲 10 d1 <= < 10 d2Fに応じて、編集記述子または編集記述子のいずれかの効果で生成されます。ここで、とはプロセッサ依存の整数です。大きさがこの範囲内にある場合、定数は;を使用して生成されます。それ以外の場合は、使用されます。Exxd1d2x0PFw.d1PEw.dEe

数値出力の場合、 、、およびの妥当なプロセッサ依存値が数値定数出力のそれぞれに使用されます。wde

(私のものを強調)

数値にも同じ規則が使用されます。Fortran 2008 標準の §10.10.4 のテキストは、Fortran 90 標準からのコピーであるため、リスト出力の変更は導入されていません。

すでに MSB で指摘されているように、I0編集記述子を使用して、必要最小限のスペースで整数値を出力できます。

! Note the space in the string
PRINT '("The difference is ",I0)', diff
于 2012-08-06T08:50:45.730 に答える